为何gcc -g多文件编译后lldb仅显示汇编而非C代码?
多文件C项目调试时LLDB不显示C代码的解决办法
以下是几个可能的原因和对应的解决步骤:
确保所有源文件都生成有效调试信息
你使用gcc -g example1.c example2.c main.c的命令理论上会给每个源文件添加调试信息,但如果编译时附带了-O1/-O2这类优化参数,会破坏调试符号与源码的关联性。建议编译时明确禁用优化,或使用-Og(保留调试友好的轻量优化):gcc -g -Og example1.c example2.c main.c若采用分步骤编译(先生成
.o文件再链接),必须给每个编译.o的命令都加上-g——仅在链接阶段加-g是无效的:gcc -g -c example1.c # 生成带调试信息的example1.o gcc -g -c example2.c gcc -g -c main.c gcc example1.o example2.o main.o -o a.out验证LLDB是否加载了调试符号
启动LLDB后,先执行image list命令,查看输出中可执行文件的条目,确认对应架构(如x86_64)的[0]条目是否带有调试信息提示。如果显示no debug info,说明编译过程中调试符号未正确生成,需重新检查编译参数。确认崩溃位置是否属于你的代码
程序崩溃后,执行bt命令查看完整调用栈。如果崩溃发生在系统库(如libc.so)的函数中,LLDB默认不会显示系统库的源码,只会展示汇编代码——这是正常现象。只有当崩溃帧指向你自己编写的代码时,才会显示对应的C源码。映射源码路径(若源码位置变动)
如果编译后移动过源码文件的位置,LLDB可能无法找到对应的C文件。此时可通过设置源码路径映射修复:# 在LLDB中执行 settings set target.source-map /原编译时的源码路径 /当前源码所在路径
内容的提问来源于stack exchange,提问作者AzerSD
相关产品推荐
相关产品推荐

