Gdb在自修改代码中切换断点

时间:2012-07-22 13:10:15

标签: linux debugging gdb breakpoints self-modifying

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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

总而言之,如果您正在编写自修改代码,那么您将走上被践踏的道路。祝好运。你需要它。

Shachar