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

未使用-g参数编译的程序能否用gdb单步汇编指令,如何设置断点?

无调试符号下gdb调试相关问题解答

1. si单步指令的可行性

可以正常使用。si(stepi缩写)是gdb原生的机器指令级单步命令,它的执行仅依赖二进制文件中包含的CPU可执行指令,和编译时-g参数生成的源码级调试符号完全无关。哪怕是完全strip掉所有符号表的二进制程序,si也可以正常执行单步操作。
补充你提到的lldb无法运行这类程序的问题:这是部分版本lldb的默认安全限制,针对无调试符号的系统级二进制会默认阻止加载,修改对应配置项后也可运行,而gdb没有这类默认限制,因此可以直接加载运行/bin/ls这类无自定义调试符号的系统程序。

2. 无调试符号时的断点设置方案

直接执行run会让程序直接跑完退出,你可以通过以下几种方式设置断点,让程序在指定位置停下:

  • 入口点断点:ELF格式二进制默认保留_start入口符号,直接执行break _start即可在程序执行的第一条指令处断住。如果二进制连_start符号也被strip,可以先执行info files查看Entry point对应的虚拟地址,直接对地址设断,例如查到入口地址为0x555555554000,执行break *0x555555554000即可。
  • 库函数断点:动态链接的程序默认保留动态库的函数符号,就算程序自身符号被清除,也可以直接对open、write这类库函数设断,执行break open即可在程序第一次调用open函数时停下。
  • 虚拟地址断点:你可以通过disas命令反汇编当前执行区域的代码,拿到想要断住的指令的虚拟地址后,直接对地址设断,例如break *0x555555555120。

设置完断点后再执行run,程序触发断点停下后,就可以正常用si单步执行每一条机器指令,也可以用ni(nexti缩写)单步但跳过函数调用,用info registers查看当前寄存器状态。

内容的提问来源于stack exchange,提问作者diciotto

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 01:24:04