41

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

问候,亚历克斯

4

5 回答 5

65

这是对我有用的解决方案。

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

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

下载 ( http://download.eclipse.org/eclipse/downloads/ ) 最新的 Stream Stable Build 或 Release of Eclipse (>=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 的正确位置,并确保启用了 Pretty Printing 选项:

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 模块

于 2011-04-19T08:07:01.667 回答
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) 重新创建您的调试启动会话(删除旧的并从头开始创建一个新的)。

于 2012-03-02T17:17:43.047 回答
6

我想扩展 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:02:13.117 回答
2

如果您遵循接受的答案并且 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(用这个答案确认)

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

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

于 2014-08-28T20:34:08.493 回答
1

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

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

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

希望这可以帮助

于 2011-02-13T17:11:25.767 回答