使用Eclipse/CDT调试C++代码时,改善变量探索的方法

71

使用Eclipse和CDT调试C++代码时,变量窗口对于在标准模板库或boost中定义的类型(例如shared_ptr)来说很繁琐并且不太信息化。

以下是std::vector的示例:

bar {…}
    std::_Vector_base<TSample<MyTraits>, std::allocator<TSample<MyTraits> > >   
        _M_impl {…} 
            std::allocator<TSample<MyTraits> >  {…} 
            _M_start    0x00007ffff7fb5010  
            _M_finish   0x00007ffff7fd4410  
            _M_end_of_storage   0x00007ffff7fd5010  

即使了解这些类型的内部信息可能会有用,但在几乎所有情况下,我都希望在这里能看到更清晰的展示,例如std::vector的值列表。是否有任何工具、插件或其他修改可以实现这一点?

编辑

以下解决方案不适用于Linux。我正在使用Ubuntu 14.04、Eclipse、g++和gdb。

我找不到一个名为"gdb-python"的包,并且Linux也不使用mingw。

6个回答

29

你需要一份支持使用Python对结构进行漂亮打印的GDB版本。我知道至少在Windows上使用mingw,这不是默认安装提供的。

漂亮打印器(Pretty Printers)是Python模块,它告诉gdb如何显示给定的结构。你可以编写自己的漂亮打印器,但已经有可供下载的STL打印器。

要在Windows上使用漂亮打印器(其他操作系统的说明应该类似):

前提条件:

安装:

  • Open a command Shell and type:

    mingw-get install gdb-python
    
  • When its finished cd to a local directory and install the printers by typing:

    svn co svn://gcc.gnu.org/svn/gcc/trunk/libstdc++-v3/python
    
  • Open the .gdbinit (create it in a text editor if need be) and type the following replaceing "C:/directory" with the folder that you checked the printers into.

    Python
    import sys
    sys.path.insert(0, 'C:/directory')
    from libstdcxx.v6.printers import register_libstdcxx_printers
    register_libstdcxx_printers (None)
    end

Eclipse设置

  • 转到Windows > Preferences > C/C++ > Debug > GDB
  • 在GDB Debugger处,输入启用Python的GDB路径,它很可能位于mingw /bin文件夹中,名称类似于gdb-python27.exe
  • 在GDB Command File处,输入先前创建的.gdb init文件的路径。

就这样,像平常一样进行调试,STL结构应该更容易阅读。


3
请问您需要Linux的解决方案。由于Linux不存在Mingw,也找不到任何gdb-python软件包。 - Rakesh Malik
启动调试后,我收到了错误信息:“无法使用命令:gdb-python27.exe --version 确定 GDB 版本”。 - truthseeker
安装32位版本的Python而不是64位版本解决了问题。 - truthseeker
当我做这个时,尝试进行调试,我会得到“最终启动序列中的错误 未能执行 MI 命令: -file-exec-and-symbols D:/Dropbox/eclipse/ProofTool/Debug/ProofTool.exe 调试器后端返回的错误信息: “D:\Dropbox\eclipse\ProofTool\Debug\ProofTool.exe”:不是可执行格式:文件格式不被识别 “D:\Dropbox\eclipse\ProofTool\Debug\ProofTool.exe”:不是可执行格式:文件格式不被识别” 对我来说,这似乎也是一个64/32位问题。我使用的是 Windows 7 64 位系统,并且我想要调试64位程序。只有32位 Python 可以工作,正如 @truthseeker 所提到的。 - xamid
我现在非常确定我需要一个64位版本的GDB,但mingw-get只安装32位版本。如何获取64位CDB版本(在支持Python的Windows上)?我现在被这个问题困住了:http://stackoverflow.com/questions/18912471/how-to-install-gdb-with-python-support-on-windows-7 - xamid
我找到了一个解决方案。使用http://equation.com的MinGW发行版(因为我想在Windows 7上使用当前版本的gcc编译器),存在问题,即equation.com发行版的gdb.exe未使用“--with-python”进行配置。由于使用MSYS构建GDB也失败了(“make”卡在“检查bison版本”的步骤上),我找到了一个包含GDB的64位MinGW发行版:“MinGW-w64-适用于32位和64位Windows”(来自http://mingw-w64.org/doku.php/download)。我安装了它,并将Eclipse链接到这个过时的MinGW 64位版本的gdb.exe。它可以工作。 - xamid

21

好的,gdb不支持STL容器。你不能说这是错误的,因为它会暴露STL对象的内部工作方式,但大多数情况下这并不是我们想要的,对吧?

如果您正在使用gdb 7.0,则可以利用漂亮的打印机。此网站http://sourceware.org/gdb/wiki/STLSupport上有一个非常简单的教程来设置它们。我在下面复制了您感兴趣的部分:

  1. 将最新的Python libstdc++打印机检出到您的计算机上的某个位置。在本地目录中执行以下操作:

  2.     svn co svn://gcc.gnu.org/svn/gcc/trunk/libstdc++-v3/python
    
  3. 将以下内容添加到您的~/.gdbinit文件中。路径需要匹配上面提到的Python模块检出的位置。因此,如果检出到/home/maude/gdb_printers/,路径将如示例中所写:

  4.     python
        import sys
        sys.path.insert(0, '/home/maude/gdb_printers/python')
        from libstdcxx.v6.printers import register_libstdcxx_printers
        register_libstdcxx_printers (None)
        end
    

对于上述示例,唯一需要调整的是路径。一旦加载了打印机支持的STL类,这些类应以更易读的方式打印出来。要以旧样式打印类,请在打印命令中使用“/r”(raw)开关(即,print /r foo)。这将打印类似于未加载Python漂亮打印机时的样子。

由于您正在使用eclipse cdt,请不要忘记将调试配置指向您的.gdbinit文件。创建新的调试配置时,转到Debugger选项卡并将.gdbinit文件的路径放入“GDB命令文件”字段中。

希望这有所帮助!


9
我遵循了指示并设置了正确的路径,但它没有运作。有什么建议可能出了问题? - Danvil
2
在Linux中我也遇到了同样的问题。通过注释掉libstdcxx/v6/init.py文件中以下代码段来解决:from libstdcxx.v6.printers import register_libstdcxx_printers register_libstdcxx_printers(gdb.current_objfile()) - David Suarez
1
它在Linux下对我有效。但是我不得不将路径设置为/home/user/pathtoprettyprinters,而~/pathtoprettyprinters则无法工作!在eclipse中,我必须将.gdbinit的路径放在窗口->首选项->C/C++->调试->gdb下,然后重新创建我的调试启动配置才能使其工作。请参见此处:https://dev59.com/6G445IYBdhLWcg3wNXc_ - user1304680

10

在变量列表中的调试视图中展开向量:

"vector_name" -> std::_Vector_base<"datatype"> -> _M_impl

然后右键单击_M_start并选择“显示为数组...”,输入其长度,然后单击“确定”。现在您可以展开向量的每个项。


1
在“显示为数组…”后,确保扩展_M_start - Garrett
1
这是一个很棒的答案。不知道为什么没有被接受。 - ping localhost
2
这适用于 vector<T>,因为它有一个基础成员类型为 T[]。对于其他 STL 类型,这种方法不起作用。这是针对向量和字符串的一个好而简单的解决方案。 - ytoledano

8
如果您在CDT中支持gdb(例如,请参见Eclipse中的GDB),则可以尝试以下操作:取消引用STL容器
很久以前,我也遇到了与您相同的问题。检查STL容器是一件痛苦的事情。然后我找到了那个链接,并将其中一些定义添加到我的.gdbinit文件中。之后生活变得更加轻松。
注意:我的gdb版本是7.1,添加这些定义很好用。我不知道在较新版本的gdb中它们是否已经包含在内。

5

我希望扩展一下有关Windows 7的回应,因为其中有些关键步骤被省略了:

这是针对使用Eclipse CDT的MinGW用户

0)如果你没有Python GDB,请打开一个shell/command窗口并使用MinGW-get.exe来“安装”启用Python的GDB,例如:

   MinGw-get.exe install gdb-python

1a) 从http://python.org/download/下载并安装Python 2.7.x。

1b) 确保在您的环境变量中设置了PYTHONPATH和PYTHONHOME。

 PYTHONPATH should be C:\Python27\Lib   (or similar)
 PYTHONHOME should be C:\Python27

1c) 将PYTHONHOME添加到您的PATH环境变量中

 %PYTHONHOME%;...

2a) 打开文本输入框,输入以下语句。注意第三行指向Python脚本所在的位置。有关此内容的注释,请参见下面的说明!

python
import sys
sys.path.insert(0, 'C:/MinGW/share/gcc-4.6.1/python')         
from libstdcxx.v6.printers import register_libstdcxx_printers
register_libstdcxx_printers (None)
end

2b) 将它保存为“.gdbinit”注意:Windows资源管理器不允许以点开头的文件名。大多数文本编辑器(包括记事本)都可以。GDB init文件就像是一些GDB命令的‘脚本',GDB将在加载时执行它们。

2c) '.gdbinit'文件需要位于GDB的工作目录中(很可能是您的项目根目录,但您的IDE可以告诉您)。

3) 打开Eclipse(或其他IDE)首选项对话框。转到C++调试器子菜单。

4) 配置Eclipse使用C:\MinGW\bin\gdb-python27.exe作为调试器和.gdbinit作为配置文件。

5a) 重新创建所有调试启动配置(删除旧的,并从头开始创建一个新的)。

--OR--

5b) 编辑每个调试配置并将其指向新的gdb-python.exe,同时指向它。

如果遇到问题:

--不要忘记在上面的python代码中更改位置以指向python目录! 这个目录是由MinGW创建的,所以不要去下载漂亮的打印机,MinGW已经为您在步骤零中完成了。只需转到您的MinGW安装目录,共享文件夹, GCC文件夹(有版本号),您会找到python文件夹。这个位置应该在由GDB加载的python脚本中。

--此外,.gdbinit很让人头疼,请确保它的名称正确,并位于GDB的工作文件夹中, 这不一定是gdb-python.exe所在的位置!观察加载GDB时的GDB输出,看看是否出现“python-enabled”,以及.gdbinit中的语句是否出现。

--最后,我在系统变量方面遇到了很多问题。如果python给出“ImportError”,那么很可能您没有设置PYTHONPATH或PYTHONHOME。

--具有“gdb-python27”(例如C:\ MinGW \ bin')的目录也应该在您的路径中,如果是这样,它会使设置eclipse变得更加轻松,因为您不需要输入绝对路径。但是,有时.gbdinit需要绝对路径。如果它可以工作,您将在调试器启动时看到gbd(控制台-> gdb跟踪)的输出,如下所示:

835,059 4^done
835,059 (gdb) 
835,059 5-enable-pretty-printing
835,069 5^done
....
835,129 12^done
835,129 (gdb) 
835,129 13source C:\MinGW\bin\.gdbinit
835,139 &"source C:\\MinGW\\bin\\.gdbinit\n"
835,142 13^done
835,142 (gdb) 

2
我知道JDT(Eclipse中的Java环境)提供自定义“格式化程序”,以在调试视图中显示变量值时应用。快速搜索CDT的相同内容,可以看到这个页面:http://wiki.eclipse.org/CDT/Better_Debugging_%28GSoC_project%29 我不知道这是否已经集成到主要的CDT线路中,你可以尝试在最新的CDT中调试时右键单击一个变量,看看是否有自定义格式化程序条目。如果没有,请在CDT跟踪器中添加一个新的跟踪器条目来请求此增强功能。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接