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

42

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

问候, Alex

5个回答

68
这是对我有效的解决方案。
下载(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中调试时的用法。
下载Eclipse的最新稳定构建版(>=3.7版本)(http://download.eclipse.org/eclipse/downloads/),下载最新的Eclipse C/C++开发工具(Eclipse CDT)(http://download.eclipse.org/tools/cdt/builds/8.0.0/index.html适用于Eclipse Indigo,http://www.eclipse.org/cdt/downloads.php适用于Eclipse Juno),运行Eclipse并选择存储选项的工作区目录(即$HOME/projects)。单击Help-> Install New Software...,单击Add...->Archive...并选择刚刚下载的CDT构建。然后您必须选择要安装的组件:单击CDT Main Features -> C/C++ Development Tools(以及可能其他您选择的组件)。然后进行安装并重新启动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点。

更新2:ubuntu 12.04有libstdc++6-4.6-dbg可以为您安装/usr/share/gcc-4.6/python/libstdcxx/ python模块


嘿,Riga,感谢你提供如此详细的解释。从 shell 中可以进行漂亮的打印。我下载了 Eclipse 的两个链接,但似乎无法使其工作。我已在“Windows-Preferences-Debug-GDB”中指定了我的 $HOME/.gdbinit 文件,但它并没有很好地打印字符串、映射等内容,因此我还在项目的“Debug Configuration”中指定了这个文件。现在看起来打印得更“漂亮”了,但是在某些时候,比如声明一个映射时,调试会停止,而且不会继续执行下去...真奇怪,没有错误弹出或其他提示。你有遇到过这种情况吗?谢谢! - AlejandroVK
1
关于让它在旧项目中工作,请参阅下面rustyx答案中的第4点。 - arberg
5
值得一提的是,Ubuntu 12.04拥有libstdc++6-4.6-dbg,它会为您安装位于/usr/share/gcc-4.6/python/libstdcxx/的Python模块。 - Andre Miras
我最近在使用CDT进行调试时遇到了问题,导致gdb挂起。我获取了一个正在运行的CPU的gdb堆栈跟踪,并且问题出现在Python漂亮打印机中。有没有人知道是谁负责这个问题,以便我可以提交一个错误报告?我已经在https://sourceware.org/bugzilla/show_bug.cgi?id=19894上提交了问题,但我不确定是否正确。 - stu
在 Fedora 23 上对我不起作用(我认为这已经预配置了,也就是说,.gdbinit 已经充满了与漂亮打印相关的内容)。 - einpoklum
显示剩余5条评论

10

我知道这并不是回答原问题的答案,但我认为对于在Eclipse上使用Windows / MinGW进行调试的人们来说可能很有用。 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?我尝试过http://www.mingw.org/,但它的gdb版本不包含python。我还尝试过http://sourceforge.net/projects/mingwbuilds/(x32-4.7.2-release-win32-sjlj-rev0和x64-4.7.2-release-posix-sjlj-rev0),但它们似乎也没有包含python gdb。 - arberg
2
mingw-get install gdb-python 将完成它的工作。 - Halil

6

我希望能够补充一下关于Windows 7的回应,因为有一些关键步骤被省略了:

这是给使用Eclipse CDT的MinGW用户

0)如果您没有Python GDB,请打开shell/command并使用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 init文件就像是要在启动时执行的GDB命令的“脚本”。

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已经在步骤零中为您准备好了。只需进入MinGW安装目录、共享文件夹、GCC文件夹(带版本号),您就可以找到Python文件夹。这个位置应该是GDB加载的Python脚本中的位置。

--此外,.gdbinit可能会有一些麻烦,请确保它的名称正确,并位于GDB的工作文件夹中,这并不一定是gdb-python.exe所在的位置!查看加载GDB时GDB输出是否出现“python-enabled”以及.gdbinit中的语句是否出现。

--最后,我遇到了许多系统变量问题。如果Python给出“ImportError”,那么最有可能的情况是您没有设置PYTHONPATH或PYTHONHOME。

--具有“gdb-python27”(例如C:\ MinGW \ bin')的目录也应该在您的路径上,如果是这样,那么设置eclipse会更加容易,因为您不需要输入绝对路径。但是,有时.gbdinit需要一个绝对路径。如果它有效,您将看到gbd(控制台-> gdb traces)在调试器启动时显示的输出:

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) 

当进入包含STL变量的方法时,gdb-python27.exe会崩溃。 - truthseeker

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兼容。


1

嘿Bob,我用了那个脚本但仍然得到所有“无用”的输出,例如,如果我想查看一个字符串的内容,这就是我得到的,即使在gdb控制台中键入print:$1 = { static npos = <optimized out>, _M_dataplus = { <std::allocator<char>> = { <__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>}, std::basic_string<char, std::char_traits<char>, std::allocator<char> >::_Alloc_hider的成员: _M_p = 0x8066574 "<SSAP_message>" }好的,我尝试更多,发现如果我使用pstirng命令,它会打印出漂亮的输出信息... - AlejandroVK
我已经按照Bob的建议使用了该选项,虽然它运行良好,但每次需要检查stl容器时都必须切换到gdb线程,这让我很不爽...如果能将脚本检查功能与鼠标悬停和变量检查面板集成在一起就太好了...有人实现过吗? - AlejandroVK

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接