使用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的值列表 . 是否有任何工具,插件或其他修改可以做到这一点?
EDIT
以下解决方案不适用于Linux . 我正在使用ubuntu 14.04,eclipse,g,gdb .
我找不到包gdb-python和linux不使用mingw
6 回答
你需要一个能够使用python来打印结构的GDB版本 . 我至少在Windows上使用mingw知道默认安装中没有提供 .
Pretty Printers是python模块,告诉gdb如何显示给定的结构 . 您可以自己编写,但已有STL打印机可供下载 .
让漂亮的打印机在Windows上工作(说明应该类似于其他操作系统):
Prerequisites
Installation:
Eclipse Setup
转到Windows>首选项> C / C>调试> GDB
它说GDB调试器将路径放到启用python的GDB上它很可能位于mingw / bin文件夹中,其名称类似于gdb-python27.exe
它说GDB命令文件将路径放到您之前创建的.gdb init文件中 .
就是这样,调试就像正常一样,stl结构应该更容易阅读 .
好吧,gdb本身不支持STL容器 . 你不能说这是不正确的,因为它会暴露STL对象的内部工作,但大多数时候它不是我们想要的,对吧?
如果您使用的是gdb 7.0,则可以利用漂亮的打印机 . 这个网站http://sourceware.org/gdb/wiki/STLSupport有一个关于如何设置它们的非常简单的教程 . 我复制了您感兴趣的部分:
由于您使用的是eclipse cdt,请不要忘记将调试配置指向.gdbinit文件 . 创建新的调试配置时,请转到“调试器”选项卡,并将.gdbinit文件的路径放在“GDB命令文件”字段中 .
我希望有所帮助!
在变量列表的调试视图中展开向量:
"vector_name"
- >std::_Vector_base<"datatype">
- >_M_impl
然后右键单击
_M_start
并选择"Display as array...",键入其长度,然后单击“确定” . 现在,您可以展开向量的每个项目 .如果您对
CDT
(例如,参见GDB in Eclipse)有gdb
支持,您可以尝试这样做:De-referencing STL containers很久以前我也偶然发现了同样的问题 . 检查STL容器是一件痛苦的事 . 然后我找到了这个链接,并在我的
.gdbinit
文件中添加了一些定义 . 生活是之后更容易 .NOTE: 我的
gdb
版本是7.1,添加这些定义工作正常 . 我不知道在gdb
的新版本中是否已包含它们 .我想扩展Windows 7响应,因为省略了一些关键步骤:
这适用于使用Eclipse CDT的MinGW用户
0)如果您没有python GDB,请打开shell /命令并使用MinGW-get.exe来“安装”启用Python的GDB,例如
1a)从http://python.org/download/获取Python 2.7.x并安装
1b)确保在您的环境中设置了PYTHONPATH和PYTHONHOME:
1c)将PYTHONHOME添加到PATH中
2a)打开文本输入,输入以下语句 . 请注意第3行指向python脚本所在的位置 . 请参阅以下关于此的说明!
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)重新创建所有调试启动配置(删除旧配置并从头开始创建新配置) .
5b)编辑每个调试配置并将其指向新的gdb-python.exe并将其指向 .
如果遇到问题:
别忘了在上面的python代码中将位置更改为python目录!这个目录是由MinGW创建的,所以不要去下载漂亮的打印机,MinGW在第0步为你做了 . 只需转到你的MinGW安装导演,共享文件夹,GCC文件夹(有版本号),你会发现python文件夹 . 这个位置应该是GDB加载的python脚本中的位置 .
另外,.gdbinit是一个PITA,确保它正确命名并且在GDB的工作文件夹中,这不一定是gdb-python.exe所在的位置!在加载GDB时查看您的GDB输出,以查看a)在加载期间是否出现'python-enabled',以及.gdbinit中的语句是否出现 .
最后,我对系统变量有很多问题 . 如果python给你'ImportError',那么你很可能没有设置PYTHONPATH或PYTHONHOME .
'gdb-python27'目录(例如C:\ MinGW \ bin')也应该在你的路径上,如果是,它会使eclipse设置得更好,因为你不需要输入绝对路径 . 但是,有时候.gbdinit需要一条绝对的道路 . 如果它工作,你会在启动调试器时看到gbd(console-> gdb trace)的输出:
我知道JDT(eclipse中的Java环境)提供了在调试视图中显示变量值时应用的自定义“格式化程序” . 在CDT中快速浏览谷歌相同的内容会带来此页面:
http://wiki.eclipse.org/CDT/Better_Debugging_%28GSoC_project%29
我不知道这是否已经集成在主CDT系列中,您可以尝试在调试时右键单击变量(在上一个CDT中)并查看是否存在自定义格式化程序条目 . 如果不可用,我建议您在CDT跟踪器中添加新的跟踪器条目以询问此增强功能 .