调试 C++ 程序时出现奇怪的 gdb 消息

Posted

技术标签:

【中文标题】调试 C++ 程序时出现奇怪的 gdb 消息【英文标题】:weird gdb message when debugging C++ program 【发布时间】:2012-05-16 15:11:11 【问题描述】:

我用的是苹果的gdb,版本如下

GNU gdb 6.3.50-20050815 (Apple version gdb-1344) (Fri Jul  3 01:19:56 UTC 2009)
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "x86_64-apple-darwin".

我不使用 Xcode IDE,因为我需要 makefile 管理的项目更方便,特别是因为我经常需要在远程机器上编译和运行程序。我最近开始使用以下 c++11 功能(在 macports 的 g++-4.6 和 4.7 上):移动构造函数、nullptr、auto 和 decltype。我最近需要对我的代码进行 d3bug,然后出现了以下奇怪的消息,而不是单步执行函数:

Die: DW_TAG_unspecified_type (abbrev = 36, offset = 4315)
        has children: FALSE
        attributes:
                DW_AT_name (DW_FORM_string) string: "decltype(nullptr)"

自从出现此消息以来,所有以下 gdb 命令都由相同的奇怪消息回答,因此无法再进行调试。似乎与c ++ 11有关。我的问题是,你有没有遇到过这个消息,以及如何摆脱 呢?

提前致谢

朱利亚诺

【问题讨论】:

我的猜测是您的 gdb 版本落后 - 看起来有 DWARF 不知道的信息。解决方案:构建/安装更新的 gdb。 【参考方案1】:

http://gcc.gnu.org/gcc-4.5/changes.html

GCC 现在也为结语生成展开信息。由 GCC 生成的 DWARF 调试信息现在比以前使用了更多 DWARF3 的特性,以及一些 DWARF4 特性。早于 7.0 的 GDB 无法处理其中任何一个,因此要调试 GCC 4.5 生成的二进制文件或库,需要 GDB 7.0 或更高版本。您可以使用 -gdwarf-3 -gstrict-dwarf 选项禁用 DWARF4 功能,或使用 -gdwarf-2 -gstrict-dwarf 将 GCC 限制为仅 DWARF2,但无论何时发出展开信息,都会无条件地发出结尾展开信息。

但是您已经知道了,因为每个人在升级编译器时都会阅读发行说明,对吧?! ;-)

【讨论】:

很高兴知道!当然,在执行“sudo port install anything”之前,我会仔细阅读整个发行说明!你觉得你在和谁说话?【参考方案2】:

您使用的 GDB 版本(Apple 版本)似乎不支持您从 macports 安装的编译器的新功能。

错误消息是报告 GDB 不理解它在程序中遇到的一些调试信息。它所显示的调试信息是一个 C++11 特性。

解决方案是升级到较新的 GDB(可能从 macports,如果有的话),不使用 GDB 不理解的功能,或者接受您无法理解的 GDB 版本这个。

【讨论】:

我尝试安装 macport 的 gdb 几次,但它从来没有为我工作过。由于我很着急,我宁愿不改变程序。我认为选项#3 是目前​​的选项。接受。

以上是关于调试 C++ 程序时出现奇怪的 gdb 消息的主要内容,如果未能解决你的问题,请参考以下文章

为啥使用 gdb 启动 C++ 程序时出现分段错误?

构建和运行应用程序时出现奇怪的噪音

gdb 显示奇怪的堆栈跟踪

使用 CreateProcess 时出现奇怪的减速

使用valgrind时出现奇怪的错误?也许是一个错误?

尝试使用 Visual Studio 2010 调试 dll (C++) 时出现错误消息