使用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
答案 0 :(得分:27)
你需要一个能够使用python来打印结构的GDB版本。我至少在使用mingw的Windows上知道默认安装中没有提供。
Pretty Printers是python模块,告诉gdb如何显示给定的结构。您可以自己编写,但已有STL打印机可供下载。
让漂亮的打印机在Windows上运行(说明应该类似于其他操作系统):
<强>先决条件强>
确保安装了Python 2.7并在系统路径中。
确保已安装MinGW-get
http://sourceforge.net/projects/mingw/files/Installer/mingw-get-inst/
确保已安装SVN客户端
<强>安装:强>
打开命令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安装
就是这样,像普通一样调试,stl结构应该更容易阅读。
答案 1 :(得分:21)
好吧,gdb本身不支持STL容器。你不能说这是不正确的,因为它会暴露STL对象的内部工作,但大多数时候它不是我们想要的,对吧?
如果你正在使用gdb 7.0,你可以利用漂亮的打印机。这个网站http://sourceware.org/gdb/wiki/STLSupport有一个关于如何设置它们的非常简单的教程。我复制了您感兴趣的部分:
将最新的Python libstdc ++打印机签出到您的地方 机。在本地目录中,执行:
svn co svn://gcc.gnu.org/svn/gcc/trunk/libstdc++-v3/python
- 醇>
将以下内容添加到〜/ .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 打印机支持的类 应该打印更多 人类可读的格式。打印 旧样式的类,使用/ 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)
如果您对gdb
有CDT
支持(例如,请参阅GDB in Eclipse),您可以尝试:De-referencing STL containers
很久以前我也偶然发现了同样的问题。检查STL容器是一件痛苦的事。然后我找到了这个链接,并在我的.gdbinit
文件中添加了一些定义。之后生活变得更加轻松。
注意:我的gdb
版本为7.1,添加这些定义的工作正常。我不知道在gdb
的较新版本中是否已包含它们。
答案 4 :(得分:5)
我想扩展Windows 7的响应,因为省略了一些关键步骤:
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跟踪器中添加一个新的跟踪器条目以询问此增强功能。