GDB打印STL数据

时间:2014-10-25 20:49:34

标签: python c++ printing stl gdb

按照本网站上的说明操作后:https://sourceware.org/gdb/wiki/STLSupport 除了打印出大量无用的信息之外,GDB仍然无法打印像vector这样的stl容器的内容。加载GDB时,我也会收到以下错误,我认为这些错误与我放入~/.gdbinit

中的Python有关
Traceback (most recent call last):
  File "<string>", line 4, in <module>
  File "/Users/mayankp/gdb_printers/python/libstdcxx/v6/printers.py", line 1247, in register_libstdcxx_printers
    gdb.printing.register_pretty_printer(obj, libstdcxx_printer)
  File "/usr/local/share/gdb/python/gdb/printing.py", line 146, in register_pretty_printer
    printer.name)
RuntimeError: pretty-printer already registered: libstdc++-v6
/Users/mayankp/.gdbinit:6: Error in sourced command file:
Error while executing Python code.

2 个答案:

答案 0 :(得分:2)

  

加载GDB时,我也会收到以下错误......

看起来您在https://sourceware.org/gdb/wiki/STLSupport上遵循的说明现在无效。如果您查看svn log,您最近会在__init__.py中添加注册漂亮的打印机:

------------------------------------------------------------------------
r215726 | redi | 2014-09-30 18:33:27 +0300 (Вт., 30 сент. 2014) | 4 lines

2014-09-30  Siva Chandra Reddy  <sivachandra@google.com>

        * python/hook.in: Only import libstdcxx.v6.
        * python/libstdcxx/v6/__init__.py: Load printers and xmethods.
------------------------------------------------------------------------

因此第二次注册会引发错误。您可以将其删除或注释掉:

#register_libstdcxx_printers (None)
  

GDB仍然无法打印stl容器的内容

你的gcc可能不匹配漂亮的打印机。有关详细信息,请参阅https://stackoverflow.com/a/9108404/72178

答案 1 :(得分:0)

从你的回溯看来,register_libstdcxx_printers()调用似乎失败了,因为已经注册了这么漂亮的打印机。为避免这种情况,您可以将其打包在try..except中,以确保.gdbinit中的说明如果失败则不会干扰GDB的启动:

python
import sys
sys.path.insert(0, '/home/user/gdb_printers/python')
from libstdcxx.v6.printers import register_libstdcxx_printers
try:
    register_libstdcxx_printers(None)
except:
    pass
end

注意:您通常从不使用bare except statement而不限定您想要捕获的异常类型。但这是一个特殊情况,启动配置文件,例如.gdbinit.pdbrc或您的PYTHONSTARTUP文件,您可能希望编写这样的防御性代码。)

但是很有可能这只会为你摆脱丑陋的追溯,并且STL载体的印刷仍然无法正常工作。因为似乎已经从其他地方注册了漂亮的打印机。

确保路径/home/user/gdb_printers/python实际上与您检出STLSupport docs中提到的模块的路径相匹配。