如何使用DDD调试CLANG/LLVM编译的程序?
如何使用DDD调试CLANG/LLVM编译的程序?
我之前也碰到过一模一样的问题——用Clang带-g编译的程序,DDD里死活看不到调试符号,换成GCC编译就一切正常,折腾了好一阵才摸清楚解决办法,给你捋捋:
先排除GDB本身的兼容问题
首先得确认不是GDB和Clang调试信息的兼容问题,毕竟DDD是基于GDB工作的。你可以先直接在命令行用GDB试试:
- 输入命令:
gdb ddd_test.e - 然后在GDB提示符里敲
list或者break main,看看能不能正常显示代码、设置断点。- 如果GDB这里也看不到符号,那大概率是Clang生成的DWARF版本和系统GDB不兼容。Clang 16默认生成DWARF 5,但Rocky Linux 8的默认GDB版本(8.3.1)对DWARF 5的支持并不完善。这时候你编译的时候加个选项指定生成DWARF 4:
再用GDB和DDD试试,应该就能识别符号了。clang -g -gdwarf-4 -O0 -o ddd_test.e ddd_test.c
- 如果GDB这里也看不到符号,那大概率是Clang生成的DWARF版本和系统GDB不兼容。Clang 16默认生成DWARF 5,但Rocky Linux 8的默认GDB版本(8.3.1)对DWARF 5的支持并不完善。这时候你编译的时候加个选项指定生成DWARF 4:
强制DDD使用GDB调试
有时候DDD的自动调试器检测会出问题,即使默认说用GDB,实际交互可能有异常。你可以:
- 启动时强制指定调试器:用这个命令启动DDD:
ddd --debugger gdb ddd_test.e - 在DDD内部手动指定:如果已经打开了DDD,就通过菜单操作:
- 点击顶部菜单栏的
Debug->Debugger Options - 在弹出的窗口里,把
Inferior Debugger改成gdb(最好填绝对路径,比如/usr/bin/gdb,避免系统找不到) - 点
Apply之后,再通过File->Open Program重新加载你的可执行文件
- 点击顶部菜单栏的
检查DDD版本(备选方案)
Rocky Linux 8的默认DDD版本可能比较老,对新的LLVM调试信息支持不足。如果前面的方法都不管用,你可以试试从源码编译一个新版的DDD,但这个步骤比较繁琐,优先试试前面的两种方法。
我当时就是靠加-gdwarf-4编译解决的问题,你按这个顺序试应该就能搞定~
内容来源于stack exchange
相关产品推荐
相关产品推荐

