如何通过GDB远程调试禁用debug symbol的可执行文件?
可行结论
完全可以实现。GDB远程调试能力不强制依赖编译阶段生成的debug symbol,这类符号仅用于映射源码行号、函数/变量名等可读性信息,不会阻断底层调试逻辑的运行,即使可执行文件被strip(移除所有调试符号),也能正常开展调试工作。
具体实现路径
基础调试流程(无额外符号文件场景)
- 目标设备端启动gdbserver加载待调试程序,指定监听端口即可,不需要额外参数:
如果是附加到已经运行的无符号进程,执行gdbserver :1234 ./stripped_target_bingdbserver :1234 --attach <进程PID>即可。 - 调试主机端使用和目标设备架构匹配的GDB版本,执行远程连接:
连接建立后可直接执行所有底层调试操作:查看/修改寄存器值、读写任意地址内存、基于地址下硬件/软件断点、单步/继续执行、查看栈帧返回地址等。(gdb) target remote <目标设备IP>:1234无符号场景下不能直接通过函数名、源码行号下断点,需要基于反汇编得到的指令地址设置断点,命令格式为
b *0x<地址值>。
体验优化方案(有对应未strip二进制场景)
如果你本地保留了和目标端程序完全同版本、同编译选项生成的未strip副本,不需要替换目标端的strip后程序,直接在本地GDB中加载符号即可获得和调试带符号程序一致的体验:
- 远程连接成功后,先通过
info proc mappings命令拿到可执行文件代码段的起始加载地址 - 加载本地未strip文件的符号,指定对应基址即可:
(gdb) add-symbol-file ./local_unstripped_bin <代码段加载基址>
加载完成后即可直接使用函数名下断点、查看源码行对应关系、打印变量名对应的值,和本地调试无差异。
常见注意点
- strip操作仅移除可执行文件中的
.symtab符号表、.debug_info/.debug_line等专用调试段,不会修改程序实际运行的代码、数据段,GDB通过CPU提供的硬件调试接口、ptrace能力即可完成调试,不需要目标程序携带额外调试信息。 - 如果目标程序开启了PIE(位置无关可执行)+ 系统ASLR(地址空间布局随机化),每次程序启动加载基址都会变化,每次重连调试都需要重新确认基址后再加载符号,避免地址错位导致断点失效、符号匹配错误。
- 跨架构远程调试时必须使用对应目标架构的GDB程序(比如调试arm64目标使用aarch64-linux-gnu-gdb),否则会出现寄存器解析错误、指令反汇编异常的问题。
内容的提问来源于stack exchange,提问作者Gowrishankar Saminathan
相关产品推荐
相关产品推荐

