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

时间:2011-02-13 16:42:05

标签: c++ eclipse gdb eclipse-cdt gdb-python

我正在尝试在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获得不错的输出,因为如果我打印一个字符串,例如我得到无用的输出....

此致 亚历

5 个答案:

答案 0 :(得分:58)

这是适合我的解决方案。

下载(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( >(gdb) p my_std_string)的命令行界面使用漂亮的打印。

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

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

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

运行Eclipse并选择将存储选项的工作空间目录(即$ HOME / projects)。单击帮助 - &gt;安装新软件...单击添加...-&gt;存档...并选择刚刚下载的CDT版本。然后,您必须选择要安装的组件:单击CDT主要功能 - &gt; C / C ++开发工具(可能还有您选择的其他组件)。然后继续安装并重新启动Eclipse。

在Eclipse中指定gdb和.gdbinit的正确位置,并确保启用了Pretty Printing选项:

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

现在,您可以在Eclipse中进行调试时看到在Variables视图中打印的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

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

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

答案 1 :(得分:10)

我知道这不能解答原始问题,但我认为对于那些在 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)重新创建调试启动会话(删除旧启动会话并从头开始创建新会话)。

答案 2 :(得分:5)

我想扩展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初始化     文件就像GBD在加载时执行的GDB命令的“脚本”。

2c)'。gdbinit'文件需要位于GDB的工作目录中(很可能是     您的项目根目录,但您的IDE可以告诉您。

3)打开Eclipse(或其他IDE)首选项对话框。转到C ++ Debugger子菜单。

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)'load-enabled'在加载期间出现,并且.gdbinit中的语句出现。

- 最后,我对系统变量有很多问题。如果python给你'ImportError',那么你很可能没有设置PYTHONPATH或PYTHONHOME。

- 带有'gdb-python27'的目录(例如C:\ MinGW \ bin')也应该在你的路径上,如果是,它会使eclipse设置得更好,因为你不需要放在绝对路径中。但是,有时候.gbdinit需要一条绝对的道路。如果它工作,你会在启动调试器时看到gbd(console-&gt; 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) 

答案 3 :(得分:2)

如果您遵循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

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

答案 4 :(得分:1)

在Eclipse CDT中显示STL对象,我这样做并且工作正常:

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

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

希望这有帮助