使用Eclipse / CDTdebuggingC ++代码时更好地进行variables探索

使用Eclipse和CDT来debuggingC ++代码,variables窗口很麻烦,对于在标准模板库或boost中定义的types(例如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 

即使这些关于这些types的内部信息可能是有用的,几乎在任何情况下,我都希望在这里有一个更清晰的表示,也就是std :: vector的值列表。 有什么工具,插件或其他修改可以做到这一点?

编辑

以下解决scheme不适用于Linux。 我使用的是Ubuntu 14.04,eclipse,g ++,gdb。

我不能find一个包gdb-python和Linux不使用mingw

你需要一个能够使用python来打印漂亮结构的GDB版本。 我知道至less在Windows使用mingw,这是不提供的默认安装。

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

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

先决条件

安装:

  • 打开命令Shell并input:

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

     svn co svn://gcc.gnu.org/svn/gcc/trunk/libstdc++-v3/python 
  • 打开.gdbinit(如果需要的话,在文本编辑器中创build它),然后键入下面的代替“C:/ directory”的文件夹来检查打印机。

    python
    导入系统
    sys.path.insert(0,'C:/ directory')
    从libstdcxx.v6.printers中导入register_libstdcxx_printers
    register_libstdcxx_printers(无)
    结束

Eclipse设置

  • 转到Windows>首选项> C / C ++>debugging> GDB
  • 在哪里说GDBdebugging器放到启用python的GDB的path,它很可能是在名为gdb-python27.exe的mingw / bin文件夹中
  • 它说的GDB命令文件把path放到你之前做的.gdb初始化文件。

就是这样,正常debugging,stl结构应该更容易阅读。

那么,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. 将以下内容添加到〜/ .gdbinit中。 path需要匹配上面的python模块签出的地方。 所以如果签出到:/ home / maude / gdb_printers /,path将如下例所示:

      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 

path应该是上面例子中唯一需要调整的元素。 一旦加载,打印机支持的STL类应该以更易读的格式打印。 要以旧式打印类,请使用print命令中的/ r(raw)开关(即print / r foo)。 这将打印类,就好像Python漂亮的打印机没有加载。

既然你在使用eclipse cdt,不要忘记把你的debuggingconfiguration指向你的.gdbinit文件。 创build一个新的debuggingconfiguration时,转到debugging器选项卡,并将path放到“GDB命令文件”字段中.gdbinit文件。

我希望有帮助!

如果你有对CDT gdb支持(例如,参见Eclipse中的GDB ),你可以试试这个: 取消引用STL容器

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

注:我的gdb版本是7.1,并添加这些定义工作正常。 我不知道是否已经包含了更新版本的gdb

在variables列表中的debugging视图中展开向量:

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

然后右键点击_M_start并select“Display as array …”,input它的长度,然后点击OK。 现在,您可以展开您的vector的每个项目。

我想扩大在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)打开一个文本input,input以下语句。 注意第三行指向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资源pipe理器不会让你命名一个以explorer为开头的文件。 大多数文本编辑(包括记事本)会让你。 GDB初始化文件就像GBD将在加载时执行的GDB命令的“脚本”一样。

2c)'.gdbinit'文件需要在GDB的工作目录下(很可能这是你的项目根目录,但是你的IDE可以告诉你。

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

4)将Eclipseconfiguration为使用C:\MinGW\bin\gdb-python27.exe .gdbinit作为debugging器,使用.gdbinit作为configuration文件。

5a)重新创build所有的debugging启动configuration(删除旧的,从头创build一个新的)。

 --OR-- 

5b)编辑每个debuggingconfiguration,并将其指向新的gdb-python.exe并将其指向。

如果遇到问题:

– 不要忘了把位置改成上面的python代码中的python目录! 这个目录是由MinGW创build的,所以不要去下载漂亮的打印机,MinGW在第零步为你做了。 刚刚转到你的MinGW安装目录,共享文件夹,GCC文件夹(有版本号),你会发现python文件夹。 这个位置是应该在GDB加载的python脚本中。

.gdbinit是一个PITA,请确保它正确的命名,并在GDB的工作文件夹,这不一定是gdb-python.exe所在的位置! 在加载GDB时查看你的GDB输出,看看在加载过程中是否出现'python-enabled',并且.gdbinit中的语句出现。

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

– 'gdb-python27'(例如C:\ MinGW \ bin')的目录也应该在你的path上,如果是这样的话,它会使eclipse设置更好一些,因为你不需要放置绝对path。 但是,有时.gbdinit需要一个绝对的path。 如果它工作,你会看到gbd(console-> gdb跟踪)的输出,像debugging器启动时一样:

 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) 

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

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

我不知道这是否已经集成在主CDT行,可能是你可以尝试右键点击一个variables,同时debugging(在最后的CDT),看看是否有一个自定义的formater条目。 如果不可用,我build议您在CDT跟踪器中添加一个新的跟踪器条目以询问此增强function。