我一直想知道调试器如何工作?特别是可以“附加”到已经运行的可执行文件的程序。我知道编译器会将代码翻译成机器语言,但是调试器如何“知道”它所附加的内容?
3 回答
至尊宝的传说
TA贡献1789条经验 获得超10个赞
据我了解:
对于x86上的软件断点,调试器将指令的第一个字节替换为CC(int3)。这是WriteProcessMemory在Windows上完成的。当CPU到达该指令并执行时int3,这将导致CPU生成调试异常。OS接收到此中断,意识到正在调试进程,并通知调试器进程已命中断点。
击中断点并停止过程后,调试器将在其断点列表中查找,并将替换为CC原来存在的字节。调试器套TF,所述陷阱标志中EFLAGS(通过修改CONTEXT),并且继续处理。陷阱标志使CPU INT 1在下一条指令上自动生成一个单步异常()。
当要调试的进程下一次停止时,调试器再次将断点指令的第一个字节替换为CC,然后该进程继续。
我不确定这是否是所有调试器完全实现的方法,但是我编写了一个Win32程序,该程序可以使用此机制进行自我调试。完全没用,但是很有教育意义。
- 3 回答
- 0 关注
- 428 浏览
添加回答
举报
0/150
提交
取消