共享对象是在RedHat Linux上构建的,虽然所有代码都是使用debug编译的,但调试器(gdb)拒绝加载符号并发出错误,如下所示:
...
GNU gdb Fedora (6.8-37.el5)
...
This GDB was configured as "x86_64-redhat-linux-gnu"...
Dwarf Error: wrong version in compilation unit header (is 4, should be 2) [in module libgrokf.so]
Run Code Online (Sandbox Code Playgroud)
有了这个错误,我无法在任何函数中触发断点,也看不到正确的堆栈跟踪.我重新编译了整个项目,但没有任何帮助.我知道在过去的某个时间调试该模块没有问题.
是什么导致了这个问题?
Dro*_*ari 14
实际上,无法调试的模块主要是从源代码构建的,除了一个由第三方提供的"外部"对象文件someextcode.o之外.
在调查问题时,发现someextcode.c是使用-g3标志编译的,显然,它将DWARF版本4放在编译单元头中.将其更改为-g可以解决问题.
不幸的是,单个模块出现问题可能会破坏整个共享对象(.so)的调试能力,而不会明确指出问题的根源.