我认为有一种通用的方法可以深入了解对象,但我无法确定。有人知道如何做吗?
当我只输出复杂对象的单个字段时,这也对我很有用。
谢谢, 比尔
我认为有一种通用的方法可以深入了解对象,但我无法确定。有人知道如何做吗?
当我只输出复杂对象的单个字段时,这也对我很有用。
谢谢, 比尔
长时间以来,使用eclipse/gdb显示stl容器对我来说也是一个大问题。
但是现在我刚刚发现,启用了python的最新版本gdb可以帮助解决这个问题。
以下是我所做的(使用Ubuntu Linux 8.10):
在项目根目录中创建一个名为.gdbinit的文件,并包含以下内容:
python import gdb.libstdcxx.v6.printers
现在,stl容器将被漂亮地打印出来。
如果您想检查是否已经有启用python的gdb(或者您的新安装是否起作用):
在gdb提示符上执行以下操作:
(gdb) python print 'Python enabled GDB is working!'
如果上述命令产生了我们预期的结果,那么它正在工作。
有关更多详细信息,请参见此博客。
Windows 7
获取漂亮的打印机:
svn co svn://gcc.gnu.org/svn/gcc/trunk/libstdc++-v3/python
使用以下设置在eclipse中配置: C/C++ Debug Gdb:
C:\MinGW\bin\gdb-python27.exe C:\MinGW\bin\.gdbinit
我想在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添加到您的路径中
%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 init文件就像是GDB命令的“脚本”,在加载时GBD将执行它们。
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已经在步骤零中为您完成了。只需转到MinGW安装目录、共享文件夹、GCC文件夹(带有版本号),您将找到Python文件夹。这个位置应该是由GDB加载的Python脚本中的位置。
--此外,.gdbinit很麻烦,请确保它的名称正确,并位于GDB的工作文件夹中,这不一定是gdb-python.exe所在的位置!查看加载GDB时的GDB输出,看看是否出现“python-enabled”,以及.gdbinit中的语句是否出现。
--最后,我遇到了很多系统变量的问题。如果Python给出“ImportError”,那么很可能您没有设置PYTHONPATH或PYTHONHOME。
--'gdb-python27' 目录(例如 C:\MinGW\bin)也应该在您的路径中,如果是这样,那么设置 Eclipse 会更加方便,因为您不需要输入绝对路径。但是,有时 .gbdinit 需要一个绝对路径。如果它起作用,您将在调试器启动时看到来自 gbd 的输出(控制台-> gdb traces),如下所示:
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)
我发现的唯一方法是使用GDB命令行:
up
命令来到达您想要的堆栈帧再次在控制台窗口中,使用print
命令显示std::string
变量:
p mystring
但这很麻烦。
我注意到的一件事是,当我将鼠标悬停在变量上时,实际上会显示std::string的字段,但它被截断了,所以我看不到最有趣的部分:字符串值。也许有一种方法可以增加显示的最大长度。
billcoke,您最好的办法是使用一些gdb宏,在eclipse的Console/Debugger窗口中可以输入。您可以在此处找到它们: http://www.yolinux.com/TUTORIALS/src/dbinit_stl_views-1.01.txt
它不会自动悬停,但您必须输入,这很累人......但即使在2009年,eclipse CDT也没有成功为我们带来一些好的调试功能,所以这是您最好的选择。
致RPSENG: 感谢rpseng的提示! 它运作得很好! 不幸的是,我的eclipse(Ganymede)似乎很困惑,无法再发现指向我自己制作的类实例和它们的继承的指针类型,因此无法再遍历这些指针的成员变量了。 您是否正在使用CDT 6.0,并且那里工作得更好?
(gdb) python print('Python enabled GDB is working!')
(即使用括号调用print)吗?没有括号会导致SyntaxError: Missing parentheses in call to 'print'
错误。 - jotadepicas