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

如何通过GCC将C源码嵌入调试信息,实现在ARM AArch64目标机GDB中无需远程调试及源码树的调试

如何通过GCC将C源码嵌入调试信息,实现在ARM AArch64目标机GDB中无需远程调试及源码树的调试

嗨,我来给你捋清楚怎么实现这个需求!你现在是交叉编译针对ARM AArch64的C程序,目标机上装的是GDB 9.1,不想折腾远程调试那一套,也不想把本地的整个源码目录拷贝到目标机上,就想让交叉编译出来的ELF文件自己带够调试用的源码信息对吧?

其实用你手头的GCC 9.3.0完全能搞定,只需要在编译的时候加上几个关键参数就行,我给你一步步说:

  • 首先,基础的调试信息参数用-g3,这个参数会开启最高级别的调试信息,比默认的-g多包含宏定义等调试时有用的内容,是嵌入源码的基础
  • 然后一定要加上-fembed-source,这个是GCC 8及以上版本才有的特性,专门用来把编译用到的C源码直接嵌入到ELF文件的调试信息段里。这样目标机上的GDB调试时,直接从ELF里就能读到源码,根本不需要本地有源码文件
  • 最后别忘了用你的AArch64交叉编译器来编译,比如你的交叉编译器是aarch64-linux-gnu-gcc的话,完整的编译命令大概是这样:
    aarch64-linux-gnu-gcc -g3 -fembed-source -o your_app your_app.c
    

编译完成后,你可以在本地先验证一下源码是不是真的嵌进去了,用readelf --debug-dump=srcu your_app这个命令,要是能看到你写的C源码内容,就说明嵌入成功了。

接下来把生成的your_app拷贝到目标机上,直接启动GDB调试就行:

gdb your_app

比如你设置断点break main,然后run启动程序,GDB就会直接显示出main函数的源码,完全不用你指定任何源码路径,也不需要搞远程调试那一堆配置,是不是很省心?

另外给你提两个小注意点:

  • 嵌入源码之后,ELF文件的体积会明显变大,毕竟把源码都塞进去了,要是你的程序源码很多,这点要提前有个心理准备
  • 目标机上的GDB 9.1完全支持读取这种嵌入的源码调试信息,版本兼容性没问题,放心用就行

备注:内容来源于stack exchange,提问作者Jens

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 16:23:04