如何通过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
相关产品推荐
相关产品推荐

