我正在转储寄存器内容,逐条指令,使用gdb
脚本(这不是交互式调试会话,layout asm
或TUI模式不在图片中。)
我想在寄存器值中添加与当前指令对应的机器代码。我已经找到了一个技巧来克服这样一个事实:disassemble
命令旨在为你提供围绕当前指令的大量上下文,并且我不知道应该反汇编多少字节来获得完整的指令。无论指令大小如何,1的范围都可以解决这个问题:
(gdb) disassemble $pc,$pc+1
Dump of assembler code from 0x400efe to 0x400eff:
=> 0x0000000000400efe <main+0>: push %r15
End of assembler dump.
我必须更进一步,添加一个标志来显示我真正想要的东西(41 57
):
(gdb) disassemble /r $pc,$pc+1
Dump of assembler code from 0x400efe to 0x400eff:
=> 0x0000000000400efe <main+0>: 41 57 push %r15
End of assembler dump.
还有另一种显示此信息的方法:
(gdb) x/i $pc
=> 0x400efe <main>: push %r15
(gdb) x/x $pc
0x400efe <main>: 0x56415741
但我找不到一个格式说明符,可以让我专门提取41 57
(我可以使用5741
)。正如您所看到的,面向指令的指令在不显示机器代码的情况下反汇编,而hexdump不知道指令长度。
最后,我需要这个值以printf
结尾,这意味着根据我得到的当前输出,仍然需要一些解析。我不确定这在纯gdb
脚本中是否可行。
如果可能的话,我宁愿避免依赖gdb
python
图层。
你知道有什么方法可以实现我想做的事吗?