Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何更改编译单元的版本?_C++_C_Debugging - Fatal编程技术网

C++ 如何更改编译单元的版本?

C++ 如何更改编译单元的版本?,c++,c,debugging,C++,C,Debugging,我试图分析为什么一个(相当大的)程序会出错。如果程序崩溃,它会将一个内核转储写入/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] 我搜索了一下,发现了一个关于stackov

我试图分析为什么一个(相当大的)程序会出错。如果程序崩溃,它会将一个内核转储写入/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]
我搜索了一下,发现了一个关于stackoverflow的例子,作者认为这是使用不同的
-g
标志编译部分代码(正是他/她使用的库)的结果

我已经在我的可执行文件(C++)和我在程序中使用的库(C)上检查了编译单元的版本

readelf --debug-dump=info Executable | grep -A 2 'Compilation Unit @'
显然,可执行文件的版本是4,而库的版本是2。我想知道是否有可能解决这个问题,以及如何解决?我也很好奇这个问题一开始是如何出现的(通过-g标志玩弄调试级别根本没有帮助)


TIA

我用g++(而不是gcc)编译了这个库,从而得到了所需的编译单元。然而,这仍然导致gdb抛出的DWARF错误,因此我在机器上编译了gdb的最新版本,最后它现在可以工作了

生成单个对象文件(.o)的输入集称为编译单元;有关详细信息,请参阅。为方便起见,“编译单元”通常缩写为“CU”

使用调试信息编译CU时,每个CU都有一个以CU头开头的调试信息部分;此标题包含版本号。此调试信息的格式为

随着时间的推移,矮人标准已经演变。对于每个主要版本,版本号都已更改。这确保了当侏儒生产者(例如编译器)创建调试信息时,侏儒消费者(例如调试器)知道会发生什么

当gdb抱怨CU的版本时,它实际上是在抱怨DWARF CU头中的版本号

为了避免这个问题,正如您所发现的,您必须确保您的整个软件开发工具链(编译器、链接器、调试器)能够“说出”相同的版本。您编译gdb最新版本的解决方案是正确的。

来自:

在GCC4.8之前,使用的默认版本是DWARF2。要使GCC4.8生成较旧的DWARF版本,请将-g与-gdwarf-2或-gdwarf-3一起使用

就我而言,添加

-gdwarf-2 -gstrict-dwarf

使旧的调试器重新工作。不过,我同意在大多数情况下,使用更新的GDB版本是最好的解决方案。

您的操作系统是什么,gcc的版本是什么,GDB的版本是什么?操作系统是Debian 6.07,gcc的版本是4.8(由于使用C++11功能,我不得不自己编译)。我使用的是Debian附带的gdb版本(这意味着它是GDB7.0.1)。是的,这就是原因。始终使用最新版本的gdb。(请接受你自己的答案,以便其他人能立即看到它的效果)。我真的很想接受我的答案,但我的“重复次数”太低,因此我必须等待2天才能这样做。