8

使用 CDT 时,我希望 std::string 显示在“变量”调试窗口中,并带有它包含的字符串。例如,如果它当前持有“历史”一词,我想在标有“变量”的调试器窗口中查看历史

我认为有一种通用的方法可以让它深入到对象中,但我不能把手指放在它上面。有没有人知道如何做到这一点?

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

谢谢,比尔

4

6 回答 6

22

长期以来,使用 eclipse/gdb 显示 stl 容器对我来说也是一个主要的痛苦。

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

它遵循我所做的(使用 Ubuntu Linux 8.10):

  • 安装 gdb 版本 >= 6.8.50(例如来自 debian experimental
  • 在项目根目录中创建一个名为 .gdbinit 的文件,其内容如下:

    python 导入 gdb.libstdcxx.v6.printers

现在 stl 容器将打印得很漂亮

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

  • 从控制台启动 gdb
  • 在 gdb 提示符下执行以下命令

    (gdb) python print '启用 Python 的 GDB 正在工作!

  • 如果上面的命令产生了我们期望的结果,那么它就可以工作了。

有关更多详细信息,请查看此博客

于 2009-01-26T16:15:48.683 回答
1

请注意,您想要深入研究对象的一般方法;你想漂亮地打印 STL 容器。

我认为 CDT 将此委托给调试器后端;即,由您的调试器(也许是gdb?)通知CDT 变量的值以及如何扩展它。

编辑:我认为 CDT 附带的 GDB 后端不支持 STL 容器的“智能”显示。如果您真的对此感兴趣,我建议您通过 cdt-dev@eclipse.org 联系 CDT 开发团队。

更新/编辑:有关如何在 CDT 中启用漂亮打印机的说明,请参阅下面的其他回复。

于 2008-11-17T15:44:44.003 回答
1

Windows 7的

获取漂亮的打印机: svn co svn://gcc.gnu.org/svn/gcc/trunk/libstdc++-v3/python

使用以下命令设置 Eclipse:C/C++ 调试 Gdb:

C:\MinGW\bin\gdb-python27.exe
C:\MinGW\bin\.gdbinit
于 2011-09-18T19:40:18.943 回答
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 添加到您的 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 初始化文件就像 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 在第 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 跟踪) 的输出:

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) 
于 2013-01-10T19:13:34.777 回答
0

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

  1. 调试窗口中,单击gdb。它就在堆栈跟踪下方。
  2. 控制台窗口中,使用 GDBup命令获取所需的堆栈帧
  3. 再次在控制台窗口中,使用print命令显示 std::string变量:

    p 我的字符串

但这很麻烦。

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

于 2009-01-14T20:01:03.780 回答
0

billcoke 最好的办法是使用一些 gdb 宏,您可以在 gdb 控制台中键入这些宏,这些宏可以在 eclipse 的“控制台/调试器”窗口中打开。你可以在这里找到它们:http: //www.yolinux.com/TUTORIALS/src/dbinit_stl_views-1.01.txt

悬停时它不会是自动的,但是你必须输入很累的....但是即使在 2009 年,eclipse CDT 也没有成功地为我们带来一些很好的调试功能,所以这是你最好的选择。

致 RPSENG:感谢 rpseng 的提示!效果很好!不幸的是,我的日食(Ganymede)似乎变得如此混乱,以至于它不会再发现指向我自己制作的类及其继承的实例的指针类型,因此不再可能单步执行这些指针的成员变量。您在使用 CDT 6.0 吗?它在那里工作得更好吗?

于 2009-02-23T15:51:14.410 回答