GDB在内存中插入什么类型的字节来调试可执行文件?
我知道GDB必须在内存中插入(或操作)一些字节,因为当我调试计算的程序,即内存区域的XOR并在该区域内设置断点时,程序会计算错误结果
但是,如果我执行x
(检查内存),那么内存中的所有内容都不会改变。
因此我的问题是:
假设我设置了一个断点,例如b *0x40206e
。 GDB对内存中的可执行文件进行了哪些(不可见的)更改以支持调试它?
答案 0 :(得分:1)
我知道GDB必须在内存中插入(或操作)一些字节 Ť 你知道它确实存在,而不是它必须。
GDB 可以使用调试寄存器来插入(少量)断点而无需修改程序代码,但只需在每个断点地址插入0xCC
就更容易了:所以没有任何限制,适用于所有处理器,而且更简单。
因此,要在x86上插入断点,GDB会将原始指令的第一个字节保存在自己的内存中(以便以后可以恢复原始指令),并用0xCC
覆盖该字节({{ 1}}"陷阱到调试器"指令)。
但是,如果我做x(检查内存),那么内存中的所有内容似乎都没有改变。
那是因为GDB知道它插入了断点的位置,并且假装程序代码未被修改(换句话说,int3
命令显示了应该是什么在记忆中,而不是实际存在的东西)。
如果它没有,那将是非常混乱的,例如发出examine
命令并查看disassemble
和" gargbage"原始指示的遗骸。