GDB打印STL d

2024-09-19 23:44:36 发布

您现在位置:Python中文网/ 问答频道 /正文

在遵循本网站上的说明之后:https://sourceware.org/gdb/wiki/STLSupport GDB除了打印出大量无用信息外,仍然无法像向量一样打印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.

Tags: inregister错误lineprettyprinterusersfile
2条回答

When GDB loads, I also get the following errors...

您在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.
                                    

所以第二次注册会抛出错误。您可以将其删除或注释掉:

^{pr2}$

GDB is still unable to print the contents of stl containers

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

从您的回溯来看,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 ^{} statement。但这是一个特殊情况,在启动配置文件中,例如.gdbinit.pdbrc或您的PYTHONSTARTUP文件中,您可能希望编写这样的防御代码)。在

但是很有可能这只会为您消除难看的回溯,并且STL向量的打印仍然不起作用。因为似乎已经有一台漂亮的打印机从别处注册了。在

确保路径/home/user/gdb_printers/python与您签出STLSupport docs中提到的模块的路径匹配。在

相关问题 更多 >