使用Eclipse / CDT调试C ++代码时,可以更好地进行变量探索

时间:2010-09-06 13:33:25

标签: c++ eclipse gdb eclipse-cdt

使用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 个答案:

答案 0 :(得分:27)

你需要一个能够使用python来打印结构的GDB版本。我至少在使用mingw的Windows上知道默认安装中没有提供。

Pretty Printers是python模块,告诉gdb如何显示给定的结构。您可以自己编写,但已有STL打印机可供下载。

让漂亮的打印机在Windows上运行(说明应该类似于其他操作系统):

<强>先决条件

<强>安装:

  • 打开命令Shell并输入:

    mingw-get install gdb-python
    
  • 当完成cd到本地目录并通过键入以下命令安装打印机时:

    svn co svn://gcc.gnu.org/svn/gcc/trunk/libstdc++-v3/python
    
  • 打开.gdbinit(如果需要,在文本编辑器中创建)并键入以下内容,将“C:/ directory”替换为您检查打印机的文件夹。

      

    的Python
      进口系统   sys.path.insert(0,'C:/ directory')
      来自libstdcxx.v6.printers import register_libstdcxx_printers
      register_libstdcxx_printers(无)
      结束

Eclipse安装

  • 转到Windows&gt;偏好&gt; C / C ++&gt;调试&gt; GDB
  • 它说GDB调试器将路径放到启用了python的GDB上,它很可能位于mingw / bin文件夹中,其名称类似于gdb-python27.exe
  • 其中说GDB命令文件将路径放到您之前创建的.gdb init文件中。

就是这样,像普通一样调试,stl结构应该更容易阅读。

答案 1 :(得分:21)

好吧,gdb本身不支持STL容器。你不能说这是不正确的,因为它会暴露STL对象的内部工作,但大多数时候它不是我们想要的,对吧?

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

  
      
  1. 将最新的Python libstdc ++打印机签出到您的地方   机。在本地目录中,执行:

        svn co svn://gcc.gnu.org/svn/gcc/trunk/libstdc++-v3/python
    
  2.   
  3. 将以下内容添加到〜/ .gdbinit中。路径需要匹配   上面的python模块是哪里   检查过了。如果签出到:   / home / maude / gdb_printers /,路径   将如下例所示:

        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
    
  4.         

    路径应该是唯一的元素   需要调整的   上面的例子。一旦加载,STL   打印机支持的类   应该打印更多   人类可读的格式。打印   旧样式的类,使用/ r   (原始)切换打印命令   (即print / r foo)。这将打印   类就像Python一样   漂亮的打印机没有加载。

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

我希望有所帮助!

答案 2 :(得分:10)

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

"vector_name" - &gt; std::_Vector_base<"datatype"> - &gt; _M_impl

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

答案 3 :(得分:8)

如果您对gdbCDT支持(例如,请参阅GDB in Eclipse),您可以尝试:De-referencing STL containers

很久以前我也偶然发现了同样的问题。检查STL容器是一件痛苦的事。然后我找到了这个链接,并在我的.gdbinit文件中添加了一些定义。之后生活变得更加轻松。

注意:我的gdb版本为7.1,添加这些定义的工作正常。我不知道在gdb的较新版本中是否已包含它们。

答案 4 :(得分:5)

我想扩展Windows 7的响应,因为省略了一些关键步骤:

这适用于使用Eclipse CDT的MinGW用户

0)如果您没有python GDB,请打开shell /命令并使用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)打开文本输入,输入以下语句。注意第3行是     指向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初始化     文件就像GBD在加载时执行的GDB命令的“脚本”。

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

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

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

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

--OR--

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

如果您遇到问题:

- 不要忘记在上面的python代码中将位置更改为python目录!    这个目录是由MinGW创建的,所以不要去下载漂亮的打印机MinGW    在第0步为你做了。只需转到你的MinGW安装导演,共享文件夹,    GCC文件夹(有版本号),你会发现python文件夹。这个位置是什么    应该是由GDB加载的python脚本。

- 另外,.gdbinit是一个PITA,确保它的名称正确并且在GDB的工作文件夹中    这不一定是gdb-python.exe所在的位置!在加载GDB时查看您的GDB输出,看看是否a)'load-enabled'在加载期间出现,并且.gdbinit中的语句出现。

- 最后,我对系统变量有很多问题。如果python给你'ImportError',那么你很可能没有设置PYTHONPATH或PYTHONHOME。

- 带有'gdb-python27'的目录(例如C:\ MinGW \ bin')也应该在你的路径上,如果是,它会使eclipse设置得更好,因为你不需要放在绝对路径中。但是,有时候.gbdinit需要一条绝对的道路。如果它工作,你会在启动调试器时看到gbd(console-&gt; gdb trace)的输出:

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) 

答案 5 :(得分:2)

我知道JDT(eclipse中的Java环境)提供了在调试视图中显示变量值时要应用的自定义“格式化程序”。在CDT中快速查看谷歌相同的内容会显示此页面:

http://wiki.eclipse.org/CDT/Better_Debugging_%28GSoC_project%29

我不知道这是否已经集成在主CDT系列中,您可以尝试在调试时右键单击变量(在上一个CDT中)并查看是否存在自定义格式化程序条目。如果没有,我建议您在CDT跟踪器中添加一个新的跟踪器条目以询问此增强功能。