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

Ale*_*oVK 39 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)
Run Code Online (Sandbox Code Playgroud)

如果我尝试在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
Run Code Online (Sandbox Code Playgroud)

似乎我没有这样的模块......我对Python没有任何线索所以我甚至不知道Python中的"模块"是什么....

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

问候,亚历克斯

Rig*_*iga 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
Run Code Online (Sandbox Code Playgroud)

这使得可以通过gdb( >(gdb) p my_std_string)的命令行界面使用漂亮的打印.

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

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

下载(适用于Eclipse Indigo的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).单击帮助 - >安装新软件...单击添加...->存档...并选择刚刚下载的CDT版本.然后,您必须选择要安装的组件:单击CDT主要功能 - > C/C++开发工具(以及可能的其他组件).然后继续安装并重新启动Eclipse.

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

Window -> preferences -> C/C++ -> Debug -> GDB
Run Code Online (Sandbox Code Playgroud)

现在,您可以在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
Run Code Online (Sandbox Code Playgroud)

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

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

  • FWIW,ubuntu 12.04有libstdc ++ 6-4.6-dbg,可以为你安装/usr/share/gcc-4.6/python/libstdcxx/ python模块. (5认同)

rus*_*tyx 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
Run Code Online (Sandbox Code Playgroud)

3)配置Eclipse CDT C:\MinGW\bin\gdb-python27.exe用作调试器和.gdbinit配置文件.

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

  • mingw-get install gdb-python可以完成它的工作. (2认同)

Wil*_*now 5

我想扩展Windows 7的响应,因为省略了一些关键步骤:

这是针对使用Eclipse CDT的MinGW用户的

0)如果您没有python GDB,请打开一个shell /命令并使用MinGW-get.exe来“安装”启用Python的GDB,例如

   MinGw-get.exe install gdb-python
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

1c)将PYTHONHOME添加到您的PATH中

 %PYTHONHOME%;...
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

2b)另存为“ .gdbinit”注意:Windows资源管理器不允许您命名以资源管理器句点开头的文件。大多数文本编辑(包括记事本)都可以。GDB初始化文件就像GBD在加载时执行的GDB命令的“脚本”一样。

2c)“ .gdbinit”文件必须位于GDB的工作目录中(很可能这是您的项目根目录,但您的IDE可以告诉您。

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

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

5a)重新创建所有调试启动配置(删除旧的调试启动配置,然后从头开始创建新的调试启动配置)。

--OR--
Run Code Online (Sandbox Code Playgroud)

5b)编辑每个调试配置,并将其指向新的gdb-python.exe并将其指向。

如果遇到问题:

-别忘了在上述python代码中将位置更改为python目录!这个目录是由MinGW创建的,因此不要去下载漂亮的打印机,MinGW在第0步中为您做了。只需转到您的MinGW安装向导,共享文件夹,GCC文件夹(具有版本号),您将找到python文件夹。此位置应该是GDB加载的python脚本中的位置。

-。gdbinit是一个PITA,请确保其正确命名并位于GDB的工作文件夹中,该文件夹不一定是gdb-python.exe所在的位置!加载GDB时,请查看您的GDB输出,以查看a)在加载过程中是否出现了“启用了python”并且是否出现了.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) 
Run Code Online (Sandbox Code Playgroud)