如何用GDB在指令中间位置执行反汇编操作?
如何在GDB中从指定偏移地址开始反汇编函数片段?
我明白你的困扰——GDB默认的disas行为确实容易让人困惑,当你只指定函数内的某个偏移地址时,它会自动反汇编整个包含该地址的函数,而不是从你指定的位置开始。下面是几种解决方法:
1. 指定反汇编范围(最直接的方式)
使用disas <起始地址>, <结束地址>的语法,就能精准反汇编你想要的片段。针对你的情况,要从0x0000000000001127(main+1)开始,到main函数结束的话,可以执行:
disas 0x0000000000001127, 0x0000000000001137
或者用函数偏移来写(更直观):
disas main+1, main+17
这样就只会输出从指定起始地址开始到结束地址的汇编指令,不会回到函数开头。
2. 使用x命令查看指定数量的指令
如果你只想看从目标地址开始的N条指令,x命令会更灵活,它不会强制关联到整个函数。比如:
- 查看单条指令:
x/i 0x0000000000001127 - 查看从该地址开始的6条指令(正好覆盖你main函数剩下的内容):
x/6i 0x0000000000001127
如果想要同时显示机器码和汇编,加上/r参数:
x/6ri 0x0000000000001127
为什么之前的方法没用?
你提到的disas main+1或者直接指定地址,GDB的逻辑是:当只传入一个地址时,它会先找到该地址所属的函数(这里是main),然后反汇编整个函数,所以不管你指定的是函数内的哪个偏移,都会从函数起始位置开始输出。必须明确指定范围,才能打破这个默认行为。
另外你怀疑PIE的问题,其实和这个场景无关——即使开启了PIE,只要你用正确的范围语法,GDB依然能正确反汇编指定片段,你用-no-pie编译后问题依旧也验证了这一点。
内容的提问来源于stack exchange,提问作者AlphaCentauri
相关产品推荐
相关产品推荐

