调试程序时奇怪的GDB消息C++

weird gdb message when debugging C++ program

本文关键字:GDB 消息 C++ 调试程序      更新时间:2023-10-16

我使用苹果的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 上):move constructors、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 有关。我的问题是,你有没有遇到过这条消息,以及如何摆脱的?

提前致谢

朱利亚诺

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,但每当发出展开信息时,都会无条件发出尾声展开信息。

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

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

错误消息报告GDB不理解它在程序中遇到的某些调试信息。它显示的调试信息是 C++11 功能。

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