使用Eclipse / CDT调试C ++代码时更好的变量探索


68

使用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

Answers:


28

您需要一个能够使用python漂亮的打印结构的GDB版本。我至少知道在使用mingw的Windows上,默认安装中未提供此功能。

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

要使Pretty Printers在Windows上工作(说明应与其他OS相似):

先决条件

安装:

  • 打开命令Shell,然后键入:

    mingw-get install gdb-python
    
  • 将cd结束后,将其复制到本地目录并通过键入以下命令安装打印机:

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

    Python 从libstdcxx.v6
    导入sys
    sys.path.insert(0,'C:/ directory')
    。printers导入register_libstdcxx_printers
    register_libstdcxx_printers(无)
    结束

Eclipse安装

  • 转到Windows>首选项> C / C ++>调试> GDB
  • 它说的GDB调试器将路径放置到启用了python的GDB上,它很可能位于mingw / bin文件夹中,其名称类似于gdb-python27.exe
  • 它说的是GDB命令文件,将路径放置到您之前创建的.gdb初始化文件中。

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


3
您能给我Linux的解决方案吗?... Linux没有mingw,我找不到任何gdb-python软件包。
Rakesh Malik

开始调试后,我收到错误消息“无法使用命令gdb-python27.exe --version确定GDB版本”。
Trueseeker 2014年

通过安装32位版本的Python(而不是64位)解决了问题。
Trueseeker 2014年

当我执行此操作并尝试调试时,Error in final launch sequence Failed to execute MI command: -file-exec-and-symbols D:/Dropbox/eclipse/ProofTool/Debug/ProofTool.exe Error message from debugger back end: "D:\Dropbox\eclipse\ProofTool\Debug\ProofTool.exe": not in executable format: File format not recognized "D:\Dropbox\eclipse\ProofTool\Debug\ProofTool.exe": not in executable format: File format not recognized出现了这对我来说也是64/32位的问题。我使用的是Windows 7 64位,并且要调试64位程序。正如@truthseeker所提到的,只有32位python可以工作
xamid

我现在很确定我需要64位版本的GDB,但是mingw-get仅安装32位版本。如何获得64位CDB版本(在支持python的Windows上)?我现在被
困在这里

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. 将以下内容添加到您的〜/ .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
    

在上面的示例中,路径应该是唯一需要调整的元素。加载后,打印机支持的STL类应以更易于理解的格式打印。要以旧样式打印类,请使用print命令中的/ r(原始)开关(即print / r foo)。这将打印类,就像未加载Python漂亮打印机一样。

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

希望对您有所帮助!


9
我按照说明进行操作,并设置了正确的路径,但是它不起作用。有什么建议可能有什么问题吗?
Danvil 2011年

2
在Linux中,这对我都不起作用。解决了它,注释掉 from libstdcxx.v6.printers import register_libstdcxx_printers register_libstdcxx_printers(gdb.current_objfile()) libstdcxx / v6 / __ init__.py文件中的行。
David Suarez 2014年

1
它在Linux下为我工作。但是,我不得不将路径设置为/ home / user / pathtoprettyprinters,而〜/ pathtoprettyprinters无法正常工作!在eclipse中,我必须将.gdbinit的路径放在window-> preferences-> C / C ++-> debug-> gdb下,然后重新创建我的调试启动配置以使其正常运行。另请参见这里:stackoverflow.com/questions/4985414/...
user1304680

10

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

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

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


1
确保_M_start通过“显示为数组...”后展开。
加勒特2014年

1
这是一个绝妙的答案。不知道为什么不接受。
ping localhost

2
这对a有效,vector<T>因为它具有type的基础成员T[]。对于其他STL类型,此功能无效。这是向量和字符串的一种好简单的解决方案。
ytoledano

8

如果您有对此的gdb支持CDT(例如,请参阅Eclipse中的GDB),则可以尝试以下操作:取消引用STL容器

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

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


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)打开一个文本输入,输入以下语句。请注意,第三行指向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 ++调试器”子菜单。

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)加载过程中是否出现了“启用了python”并且是否出现了.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中的google可以看到以下页面:

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

我不知道它是否已经集成到CDT的主行中,可能是您可以尝试在调试时右键单击一个变量(在最后一个CDT中),看看是否有一个自定义格式化程序条目。如果不可用,我建议您在CDT跟踪器中添加一个新的跟踪器条目,以要求进行此增强。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.