Dan*_*vil 67 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
Run Code Online (Sandbox Code Playgroud)
即使关于这些类型的内部结构的这些信息可能有用,但在几乎任何情况下我都期望在这里有更清晰的表示,即std :: vector的值列表.是否有任何工具,插件或其他修改可以做到这一点?
编辑
以下解决方案不适用于Linux.我正在使用ubuntu 14.04,eclipse,g ++,gdb.
我找不到包gdb-python和linux不使用mingw
Dan*_*cci 27
你需要一个能够使用python来打印结构的GDB版本.我至少在Windows上使用mingw知道默认安装中没有提供.
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
Run Code Online (Sandbox Code Playgroud)完成cd到本地目录并通过键入以下命令安装打印机:
svn co svn://gcc.gnu.org/svn/gcc/trunk/libstdc++-v3/python
Run Code Online (Sandbox Code Playgroud)打开.gdbinit(如果需要,在文本编辑器中创建它)并键入以下内容,将"C:/ directory"替换为您检查打印机的文件夹.
来自libstdcxx.v6.printers的Python
import sys
sys.path.insert(0,'C:/ directory')
import register_libstdcxx_printers
register_libstdcxx_printers(None)
end
Eclipse安装程序
就是这样,调试就像正常一样,stl结构应该更容易阅读.
ped*_*oel 21
好吧,gdb本身不支持STL容器.你不能说这是不正确的,因为它会暴露STL对象的内部工作,但大多数时候它不是我们想要的,对吧?
如果您使用的是gdb 7.0,则可以利用漂亮的打印机.这个网站http://sourceware.org/gdb/wiki/STLSupport有一个关于如何设置它们的非常简单的教程.我复制了您感兴趣的部分:
将最新的Python libstdc ++打印机签出到您机器上的某个位置.在本地目录中,执行:
Run Code Online (Sandbox Code Playgroud)svn co svn://gcc.gnu.org/svn/gcc/trunk/libstdc++-v3/python
将以下内容添加到〜/ .gdbinit中.路径需要匹配上面的python模块签出的位置.因此,如果签出到:/ home/maude/gdb_printers /,路径将如示例所示:
Run Code Online (Sandbox Code Playgroud)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命令文件"字段中.
我希望有所帮助!
0x0*_*Wan 10
在变量列表的调试视图中展开向量:
"vector_name"
- > std::_Vector_base<"datatype">
- >_M_impl
然后右键单击_M_start
并选择"显示为数组...",键入其长度,然后单击"确定".现在,您可以展开向量的每个项目.
如果您有gdb
支持CDT
(例如,参见Eclipse中的GDB),您可以尝试这样做:取消引用STL容器
很久以前我也偶然发现了同样的问题.检查STL容器是一件痛苦的事.然后我找到了链接并将.gdbinit
一些定义添加到我的文件中.之后生活变得更轻松.
注意:我的gdb
版本是7.1,添加这些定义工作正常.我不知道gdb
他们的新版本是否已包含在内.
我想扩展Windows 7响应,因为省略了一些关键步骤:
0)如果您没有python GDB,请打开shell /命令并使用MinGW-get.exe来"安装"支持Python的GDB,例如
MinGw-get.exe install gdb-python
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
1c)将PYTHONHOME添加到PATH中
%PYTHONHOME%;...
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
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--
Run Code Online (Sandbox Code Playgroud)
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)的输出:
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)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
20874 次 |
最近记录: |