我试图分析为什么一个(非常大的)程序段错误.如果程序崩溃,它会将核心转储写入/ tmp,我尝试使用gdb进行分析.但是,gdb给我以下错误:
Reading symbols from /home/user/Executable...Dwarf Error:
wrong version in compilation unit header (is 4, should be 2)
[in module /home/user/Executable]
Run Code Online (Sandbox Code Playgroud)
我搜索了一下,在stackoverflow上发现了一个线程,作者认为这是编译部分代码(正是他/她正在使用的库)的结果,带有不同的-g标志.
我已经检查了我的可执行文件(C++)上的编译单元版本以及我在程序中使用的库(C)
readelf --debug-dump=info Executable | grep -A 2 'Compilation Unit @'
Run Code Online (Sandbox Code Playgroud)
显然,可执行文件到处都有4版本,而库有2版本.我想知道是否有可能解决这个问题以及如何解决?我也很好奇这个问题实际上是如何实际上升的(通过-g标志来调试调试级别并没有帮助).
TIA
小智 6
产生单个目标文件(.o)的输入集称为编译单元; 有关更多信息,请参阅维基百科.为方便起见,"编译单元"通常缩写为"CU".
当用调试信息编译CU时,每个CU具有以CU头开始的调试信息部分; 此标头包含版本号.此调试信息采用称为DWARF的格式.
随着时间的推移,DWARF标准已经发展.对于每个主要版本,版本号已更改.这确保了当DWARF生成器(例如,编译器)创建调试信息时,DWARF消费者(例如,调试器)知道期望什么.
当gdb抱怨CU的版本时,它实际上抱怨DWARF CU头中的版本号.
为了避免这个问题,正如您所发现的那样,您必须确保整个软件开发工具链(编译器,链接器,调试器)能够"说出"相同的DWARF版本.您编译最新版本的gdb的解决方案是正确的.