RTEMS下C++程序调试异常:ELF调试段缺失源文件路径
问题分析与解决
1. WAF不给C++传递调试参数的原因
WAF中针对C和C++的编译参数是分开管理的:
CFLAGS仅作用于C语言编译(对应gcc)CXXFLAGS才是作用于C++编译(对应g++)
你的wscript大概率只把-Og和-g添加到了CFLAGS变量中,没有同步配置CXXFLAGS,导致g++编译时根本没拿到调试参数。
2. g++未写入源文件路径到ELF调试段的原因
g只有在编译时带上-g参数(开启调试信息生成),才会将源文件路径、符号表等调试数据写入ELF的.debug_info、.debug_line等段中。因为你的C编译没拿到-g,自然不会生成这些调试信息,objdump和gdb也就找不到init.cpp的路径。
解决步骤
修改你的wscript,将调试参数同时添加到CFLAGS和CXXFLAGS中:
def build(bld): # 给C和C++都开启调试优化与调试信息 bld.env.CFLAGS += ['-Og', '-g'] bld.env.CXXFLAGS += ['-Og', '-g'] # 后续的目标配置示例 bld.program( target='led_cpp', source='init.cpp', # 其他必要配置,比如链接RTEMS库等 )
验证方法
- 重新编译时,查看编译命令行输出,确认g++调用时包含了
-Og和-g参数 - 用
objdump --debugging led_cpp检查ELF文件,应该能找到init.cpp的路径信息 - gdb连接后执行
info sources,即可看到init.cpp出现在列表中
内容的提问来源于stack exchange,提问作者embedded.kyle
相关产品推荐
相关产品推荐

