GDB 在内存中插入什么样的字节来调试可执行文件?
What kinds of bytes does GDB insert in memory to debug the executable?
What kinds of bytes does GDB insert in memory to debug the executable?
我知道 GDB 必须在内存中插入(或操作)一些字节,因为当我调试一个计算程序时,即对内存区域进行异或并在该区域内设置断点,然后程序计算错误的结果。
但是,如果我x
(检查内存),那么内存中的所有内容似乎都没有变化。
因此我的问题是:
假设我设置了一个断点,例如 b *0x40206e
。 GDB 对内存中的可执行文件进行了哪些(不可见的)更改以支持对其进行调试?
I know that GDB must insert (or manipulate) some bytes in memory
t
You know that it does, not that it must.
GDB 可以 而不是使用调试寄存器插入(少量)断点而不修改程序代码,但是在每个断点地址简单地插入 0xCC
更容易:这样做没有任何限制,适用于所有处理器,而且更简单。
因此,为了在 x86 上插入断点,GDB 将原始指令的第一个字节保存在自己的内存中(以便稍后可以恢复原始指令),并用 0xCC
覆盖该字节( int3
"trap to debugger" 指令)。
However, if I do x (inspect memory), then everything in memory seems unchanged.
那是因为 GDB 知道它在哪里插入了断点,并且 假装 程序代码没有被修改(换句话说,examine
命令告诉你什么是应该的留在记忆中,而不是实际存在的东西)。
如果没有,那将是非常混乱的,例如发出 disassemble
命令并查看 int3
和 "gargbage" 原始说明的剩余部分。
What kinds of bytes does GDB insert in memory to debug the executable?
我知道 GDB 必须在内存中插入(或操作)一些字节,因为当我调试一个计算程序时,即对内存区域进行异或并在该区域内设置断点,然后程序计算错误的结果。
但是,如果我x
(检查内存),那么内存中的所有内容似乎都没有变化。
因此我的问题是:
假设我设置了一个断点,例如 b *0x40206e
。 GDB 对内存中的可执行文件进行了哪些(不可见的)更改以支持对其进行调试?
I know that GDB must insert (or manipulate) some bytes in memory t You know that it does, not that it must.
GDB 可以 而不是使用调试寄存器插入(少量)断点而不修改程序代码,但是在每个断点地址简单地插入 0xCC
更容易:这样做没有任何限制,适用于所有处理器,而且更简单。
因此,为了在 x86 上插入断点,GDB 将原始指令的第一个字节保存在自己的内存中(以便稍后可以恢复原始指令),并用 0xCC
覆盖该字节( int3
"trap to debugger" 指令)。
However, if I do x (inspect memory), then everything in memory seems unchanged.
那是因为 GDB 知道它在哪里插入了断点,并且 假装 程序代码没有被修改(换句话说,examine
命令告诉你什么是应该的留在记忆中,而不是实际存在的东西)。
如果没有,那将是非常混乱的,例如发出 disassemble
命令并查看 int3
和 "gargbage" 原始说明的剩余部分。