如何在 Eclipse CDT 中为 C++ STL 对象启用 gdb 漂亮打印?

Posted

技术标签:

【中文标题】如何在 Eclipse CDT 中为 C++ STL 对象启用 gdb 漂亮打印?【英文标题】:How to enable gdb pretty printing for C++ STL objects in Eclipse CDT? 【发布时间】:2011-06-26 12:06:59 【问题描述】:

我正在尝试在 eclipse cdt 中为 STL 对象添加漂亮的打印。我尝试按照此处描述的步骤操作:

http://sourceware.org/gdb/wiki/STLSupport

我检查了 python 文件夹,但我似乎无法完成此操作...

我创建了一个 gdbinit 并选择了我的调试配置,但每当我尝试开始调试时,我都会收到以下错误:

Error while executing Python code.
!STACK 0
java.lang.Exception: /home/lizardking/workspace/eu.sofia.kpi.cpp.x86.testapp/.gdbinit:6: Error in sourced command file:
Error while executing Python code.
        at org.eclipse.cdt.dsf.mi.service.command.AbstractMIControl$RxThread.processMIOutput(AbstractMIControl.java:824)
        at org.eclipse.cdt.dsf.mi.service.command.AbstractMIControl$RxThread.run(AbstractMIControl.java:662)

如果我尝试在 python shell 中执行 gdbinit 的内容,我会收到以下错误:

Python 2.6.6 (r266:84292, Sep 15 2010, 15:52:39) 
[GCC 4.4.5] on linux2
Type "help", "copyright", "credits" or "license" for more information.
import sys
sys.path.insert(0, '/home/Documents/python')
from libstdcxx.v6.printers import register_libstdcxx_printers
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named libstdcxx.v6.printers

似乎我没有这样的模块...我对 Python 不了解,所以我什至不知道 Python 中的“模块”是什么...

有人可以帮我解决这个问题吗?能够看到真实的调试信息对我来说非常重要,或者这样说很有用。或者我什至可以从控制台调试并从 gdb 获得不错的输出,因为如果我打印一个字符串,例如我得到无用的输出......

问候, 亚历克斯

【问题讨论】:

【参考方案1】:

这是适合我的解决方案。

下载 (http://www.gnu.org/software/gdb/download/) 并安装最新的 gdb(即使用 --prefix $HOME)。它支持python脚本。

通过执行获得python漂亮的打印机

svn co svn://gcc.gnu.org/svn/gcc/trunk/libstdc++-v3/python

在您选择的目录中(即 $(HOME)/distribs/gdb_printers)。您将在结帐目录中获得“python”子目录。

把它放在你的 $(HOME)/.gdbinit 文件中,并带有漂亮打印机的正确路径:

python
import sys 
sys.path.insert(0, '/home/YOUR_NAME_HERE/distribs/gdb_printers/python')
from libstdcxx.v6.printers import register_libstdcxx_printers
register_libstdcxx_printers (None)
end

这使得通过 gdb ( &gt;(gdb) p my_std_string) 的命令行界面可以使用漂亮的打印。

接下来解释在 Eclipse 中调试时的用法。

下载 (http://download.eclipse.org/eclipse/downloads/) Eclipse 的最新 Stream Stable Build 或 Release(>=3.7 版本)。

下载(http://download.eclipse.org/tools/cdt/builds/8.0.0/index.html 用于 Eclipse Indigo 或 http://www.eclipse.org/cdt/downloads.php 用于 Eclipse Juno)最新的 Eclipse C/C++ 开发工具 (Eclipse CDT)。

运行 Eclipse 并选择将存储选项的工作区目录(即 $HOME/projects)。单击 Help->Install New Software... 单击 Add...->Archive... 并选择您刚刚下载的 CDT 版本。然后您必须选择要安装的组件:单击 CDT Main Features -> C/C++ Development Tools(可能还有您选择的其他组件)。然后继续安装并重新启动 Eclipse。

在 Eclipse 中指定 gdb 和 .gdbinit 的正确位置,并确保启用了“漂亮打印”选项:

Window -> preferences -> C/C++ -> Debug -> GDB

现在您可以在 Eclipse 中调试时在变量视图中看到漂亮打印的 STL 容器。

可以使用其他命令使 gdb 输出更体面:

set print pretty on
set print object on
set print static-members on
set print vtbl on
set print demangle on
set demangle-style gnu-v3
set print sevenbit-strings off

更新:关于让它适用于旧项目,请参阅下面 rustyx 答案中的第 4 点)。

UPDATE2:ubuntu 12.04 有 libstdc++6-4.6-dbg 为你安装 /usr/share/gcc-4.6/python/libstdcxx/ python 模块

【讨论】:

嘿里加,感谢您提供非常详细的解释。漂亮的印刷工作从外壳。我下载了 Eclipse 的两个链接,但我似乎无法完成这项工作。我已经在 Windows-Preferences-Debug-GDB 中指定了我的 $HOME/.gdbinit 文件,但它没有很好地打印字符串、地图等,所以我还在项目的调试配置中指定了这个文件。现在这似乎打印“更漂亮”但在某些时候,比如声明地图,调试停止并且它不会继续通过那条线......真的很奇怪,没有弹出错误或什么都没有。这发生在你身上吗?谢谢! @Alejandro 我使用此配置没有任何问题,并且不知道如何重现您的问题以帮助您。可以尝试在这里报错bugs.eclipse.org/bugs/show_bug.cgi?id=302121 谢谢里加,我创建了另一个测试项目,它工作正常,虽然我必须为每个项目指定 .gdbinit,否则我不会得到漂亮的打印。此外,我应该在哪里执行这些设置命令?贝壳?再次感谢非常好的解释 关于让它适用于旧项目,请参阅下面 rustyx 答案中的第 4 点)。 FWIW,ubuntu 12.04 有 libstdc++6-4.6-dbg 为你安装 /usr/share/gcc-4.6/python/libstdcxx/ python 模块。【参考方案2】:

我知道这不能回答最初的问题,但我认为它可能对那些在 Windows / MinGW 上在 Eclipse 中进行调试的人有用。 Windows 的过程类似:

1) 从http://python.org/download/获取Python 2.7.x

2) 在某处创建.gdbinit,其中包含如下内容:

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

3) 将 Eclipse CDT 配置为使用 C:\MinGW\bin\gdb-python27.exe 作为调试器,使用您的 .gdbinit 作为配置文件。

4) 重新创建调试启动会话(删除旧会话并从头开始创建新会话)。

【讨论】:

你从哪里得到 C:\MinGW\bin\gdb-python27.exe?我试过mingw.org,但它的gdb 版本不包含python。我试过sourceforge.net/projects/mingwbuilds(x32-4.7.2-release-win32-sjlj-rev0 和 x64-4.7.2-release-posix-sjlj-rev0),但它们也不包含它出现的 python gdb。 mingw-get install gdb-python 会完成它的工作。【参考方案3】:

我想扩展 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) 打开一个文本回车,输入以下语句。注意第三行是 指向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(控制台->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) 

【讨论】:

gdb-python27.exe 在进入包含 STL 变量的方法时崩溃。【参考方案4】:

如果您关注accepted answer 和 UPDATE2 并且 gdb 收到如下错误:

Traceback (most recent call last):
  File "<string>", line 3, in <module>
  File "/usr/share/gcc-4.8/python/libstdcxx/v6/printers.py", line 54
    raise ValueError, "Cannot find type %s::%s" % (str(orig), name)
                ^
SyntaxError: invalid syntax
/home/[you]/.gdbinit:6: Error in sourced command file:
Error while executing Python code.

这是因为您的 gdb 版本使用的是 Python 3(通过 this answer 确认)

解释了此问题的解决方法here

或者,按照说明从与 Python 3 兼容的 svn://gcc.gnu.org 获取源代码

【讨论】:

【参考方案5】:

要在 Eclipse CDT 中显示 STL 对象,我这样做并且效果很好:

http://www.yolinux.com/TUTORIALS/GDB-Commands.html#STLDEREF

(您发送的链接中的选项编号 2)

希望对你有帮助

【讨论】:

嘿鲍勃,我使用了那个脚本,但我仍然得到所有“无用”的输出,例如,如果我想查看字符串的内容,这就是我得到的,甚至输入 print gdb 控制台:$1 = static npos = , _M_dataplus = <:allocator>> = <:new_allocator>> = , , std::basic_string, std::allocator 的成员 >::_Alloc_hider: _M_p = 0x8066574 "" 好的,我尝试了更多,我可以看到如果我使用 pstirng commnad 它可以工作,它会打印一个很好的输出信息...是 t 我已经按照 Bob 的建议使用了该选项,虽然它工作正常,但我讨厌每次需要检查 stl 容器时都必须切换到 gdb 线程......集成脚本会很棒通过鼠标悬停和可变检查面板检查能力...有人做到了吗?

以上是关于如何在 Eclipse CDT 中为 C++ STL 对象启用 gdb 漂亮打印?的主要内容,如果未能解决你的问题,请参考以下文章

Eclipse CDT:如何在 C 源代码上使用 GCC C++ 编译器?

在 c++ Eclipse CDT 中使用不同的值构建

使用 Eclipse CDT/RSE/RDT 远程调试 C++ 应用程序

如何将 GDB 调试器安装到 Eclipse CDT

如何在没有 gdbserver 的情况下使用 Eclipse CDT 进行远程调试?

详解小白利用eclipse+CDT+MinGW搭建C++开发环境