调用htobe64后cgdb无法显示源代码的原因及解决方法
问题原因
htobe64是glibc提供的字节序转换宏,本质是带always_inline属性的内联实现,定义在<endian.h>头文件中。测试代码没有显式引入该头文件,编译器隐式导入时生成的调试信息不完整。- 你使用的GDB 8.2版本发布时间远早于GCC 11,对GCC 11默认生成的DWARF5格式调试信息兼容性不足,无法正确映射内联宏对应的上层源码位置,反而读取到glibc构建时残留的临时头文件路径
/home/user/byteswap.h,本地不存在该文件时CGDB找不到对应源码,就会自动切换到汇编视图、显示启动屏。
解决方法
可任选以下一种方法恢复正常调试:
- 编译时指定生成DWARF4格式的调试信息,适配旧版本GDB:
g++ -gdwarf-4 -g main.cpp -o a.out - 升级GDB到10.1及以上版本,新版本已完全兼容GCC 11生成的DWARF5调试信息,可正确识别源码映射关系。
- 显式在代码开头引入
htobe64对应的头文件,降低调试信息生成异常的概率:#include <endian.h> - 如果调试时仍然会跳转到不存在的
byteswap.h,可在GDB输入命令跳过该文件:
后续调试会自动跳过该系统头文件,直接停在你自己写的源码位置。skip file /home/user/byteswap.h
内容的提问来源于stack exchange,提问作者phinz
相关产品推荐
相关产品推荐

