You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:36:48