控制Eclipse CDT调试器的输出?

8
使用CDT时,我希望在“变量”调试窗口中看到std::string及其包含的字符串。例如,如果它目前包含单词“history”,我想在标记为“variables”的调试器窗口中看到history

我认为有一种通用的方法可以深入了解对象,但我无法确定。有人知道如何做吗?

当我只输出复杂对象的单个字段时,这也对我很有用。

谢谢, 比尔

6个回答

22

长时间以来,使用eclipse/gdb显示stl容器对我来说也是一个大问题。

但是现在我刚刚发现,启用了python的最新版本gdb可以帮助解决这个问题。

以下是我所做的(使用Ubuntu Linux 8.10):

  • 安装gdb版本>=6.8.50(例如从Debian experimental下载
  • 在项目根目录中创建一个名为.gdbinit的文件,并包含以下内容:

    python import gdb.libstdcxx.v6.printers

现在,stl容器将被漂亮地打印出来

如果您想检查是否已经有启用python的gdb(或者您的新安装是否起作用):

  • 从控制台启动gdb
  • 在gdb提示符上执行以下操作:

    (gdb) python print 'Python enabled GDB is working!'

  • 如果上述命令产生了我们预期的结果,那么它正在工作。

有关更多详细信息,请参见此博客


1
+1 这是很好的东西。我在 Gentoo 上使用它时遇到了很多问题。构建支持 Python 的 GDB 非常容易(设置 USE 标志),但 gdb.libstdcxx 模块未包含在内。最终我在这里找到了它:http://sourceware.org/gdb/wiki/STLSupport - Mark
有一些麻烦让这个工作起来。从SVN检出的代码中,“import gdb”被注释掉了,导致出现错误。一旦我取消了该行的注释,它就可以在命令行中工作了。为了使它在Eclipse中工作,我不得不编辑调试配置以选择我的自定义.gdbinit文件。现在它已经全部设置好了,我可以看到大多数STL数据结构的合理打印版本。终于很高兴有这个可用! - bnsmith
1
@bnsmith,你是怎么做到这个的:“我必须编辑调试配置来选择我的自定义.gdbinit文件。” 我看到了Window/Preference/Debug/GDB,但没有你提到的内容。 - Bob Yoplait
这应该是被选中的答案。非常有帮助! - Thomas Thorogood
这是一个老问题,但是它不应该是(gdb) python print('Python enabled GDB is working!')(即使用括号调用print)吗?没有括号会导致SyntaxError: Missing parentheses in call to 'print'错误。 - jotadepicas
显示剩余3条评论

1
请注意,您不需要一种通用的方法来深入对象;您需要漂亮地打印STL容器。
我认为CDT将此委托给调试器后端;即由您的调试器(例如gdb)告知CDT有关变量值及其如何展开的信息。
编辑:我认为随CDT一起提供的GDB后端没有任何支持“智能”显示STL容器的功能。如果您真的对此感兴趣,建议您联系cdt-dev@eclipse.org的CDT开发团队。
更新/编辑:请参见下面的其他回复以了解如何在CDT中启用漂亮的打印机。

1

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

1

我想在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添加到您的路径中

 %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) 

0

我发现的唯一方法是使用GDB命令行:

  1. 调试窗口中,单击gdb。它就在堆栈跟踪下面。
  2. 控制台窗口中,使用GDB up命令来到达您想要的堆栈帧
  3. 再次在控制台窗口中,使用print命令显示std::string变量:

    p mystring

但这很麻烦。

我注意到的一件事是,当我将鼠标悬停在变量上时,实际上会显示std::string的字段,但它被截断了,所以我看不到最有趣的部分:字符串值。也许有一种方法可以增加显示的最大长度。


0

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,并且那里工作得更好?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接