0

我有一个程序在运行时会修改自己的代码。当我试图在代码中设置断点时,它永远不会中断,因为代码的修改会以某种方式删除断点。

我听说过硬件断点,但它是用 gdb 编写的,我的硬件不支持它们。有没有其他方法可以打破自我修改代码?

4

1 回答 1

1

GDB 有两种方式放置断点。一种是通过设置某些特殊寄存器来指示 CPU 在执行该行时中断(引发中断,然后内核将其转换为调试器的信号)。这些就是 GDB 所说的“硬件断点”。如果您的硬件不支持它们,则它们不受支持。

另一种方法是实际修改代码,并将要中断的行的第一条指令替换为引发所述中断的命令。例如,在 Intel X86 下,引发中断的命令,比如“int 5”,是两个字节长,但引发中断 3 的命令只有一个字节长。这样它就可以准确地用于此目的。

调试器用中断的指令替换指令,一旦断点被​​击中,用调试器干扰之前的代码替换该代码。是的,这种技术不适用于自修改代码(我应该提一下,也不适用于只读存储器中的代码,例如写入闪存的代码)。

如果您的代码足够有序(显然,它不是特别有序),您可以在将代码写入内存后立即中断一次,然后才在正确的位置放置第二个断点。如果你足够努力地研究 GDB 的脚本功能,你甚至可以让它自动化,这样你就不会被第一个断点所困扰。

总而言之,如果您正在编写自我修改的代码,那么您就偏离了这条路。祝你好运。你会需要它的。

沙查尔

于 2012-07-22T20:14:04.173 回答