如何在 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 ( >(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>> =以上是关于如何在 Eclipse CDT 中为 C++ STL 对象启用 gdb 漂亮打印?的主要内容,如果未能解决你的问题,请参考以下文章
Eclipse CDT:如何在 C 源代码上使用 GCC C++ 编译器?
使用 Eclipse CDT/RSE/RDT 远程调试 C++ 应用程序