3

我正在使用 Code::Blocks 并希望启用 gdb python。所以我按照 C::B wiki http://wiki.codeblocks.org/index.php?title=Pretty_Printers来配置它。

我的 pp.gdb 与 wiki 中的相同,只是我将路径替换为到 printers.py 的路径。

python
import sys
sys.path.insert(0, 'C:/Program Files (x86)/mingw-builds/x32-4.8.1-posix-dwarf-rev3/mingw32/share/gcc-4.8.1/python/libstdcxx/v6')
from printers import register_libstdcxx_printers
register_libstdcxx_printers (None)
end

然后我测试了它:

(gdb) source C:\Program Files (x86)\mingw-builds\x32-4.8.1-posix-dwarf-rev3\mingw32\bin\pp.gdb 

错误信息显示:

Traceback (most recent call last):
  File "<string>", line 4, in <module>
  File "C:/Program Files (x86)/mingw-builds/x32-4.8.1-posix-dwarf-rev3/mingw32/
  share/gcc-4.8.1/python/libstdcxx/v6/printers.py", line 911, in register_libstdcxx_printers
    gdb.printing.register_pretty_printer(obj, libstdcxx_printer)
  File "c:\program files (x86)\mingw-builds\x32-4.8.1-posix-dwarf-rev3\mingw32\
  share\gdb/python/gdb/printing.py", line 146, in register_pretty_printer
    printer.name)
RuntimeError: pretty-printer already registered: libstdc++-v6
C:\Program Files (x86)\mingw-builds\x32-4.8.1-posix-dwarf-rev3\mingw32\bin\pp.gd
b:6: Error in sourced command file:
Error while executing Python code.

我该如何解决?

4

3 回答 3

6

今天,我也看到了类似的问题,在我将 libstdcxx 的漂亮版本从旧的 gcc4.7.x 版本更新到 gcc 的主干 HEAD 版本以修复一些其他问题之后。

我也在使用 Codeblocks,并且在我的自定义 gdb 脚本中有这两行。

from libstdcxx.v6.printers import register_libstdcxx_printers
register_libstdcxx_printers (None)

请注意,当它启动时,我已经将-nx选项解析为 gdb。经过一段时间的调整,我发现libstdcxx的漂亮打印机自动加载并from...import...在行后注册。因此,作为一种解决方案,您可以只注释掉第二行,这里一切正常。

from libstdcxx.v6.printers import register_libstdcxx_printers
#register_libstdcxx_printers (None)

另外,我认为 GDB 的官方 wiki STLSupport - GDB Wiki和 Codeblocks 的官方 wiki Pretty Printers - CodeBlocks应该更新以说明这个问题。

编辑:我只看到来自 GCC svn trunk 的文件:libstdcxx\v6__init__.py(也许是最近添加的),我看到它有代码:

# Load the pretty-printers.
from printers import register_libstdcxx_printers
register_libstdcxx_printers(gdb.current_objfile())

所以,我认为这段代码会自动注册打印机,所以你不需要显式调用register_libstdcxx_printers (None).

于 2015-02-09T07:28:19.487 回答
1

您可能不需要此代码。似乎 libstdc++ 打印机已预加载——这在许多设置中都很正常……我们将打印机设计为“正常工作”,而使用 python 代码显式加载打印机的方法是一种过渡性的东西。

一种检查方法是运行 gdb -nx,启动 C++ 程序,然后使用“info pretty-printer”。

于 2013-08-17T20:49:25.597 回答
0

如果您收到此错误RuntimeError: pretty-printer already registered: libstdc++-v6,则意味着您无需执行C::B wiki中提到的任何操作。
您可以取消选中Disable startup scripts (-nx)以下选项:Codeblocks->Settings->Debugger->Default就是这样。

于 2019-10-10T19:37:58.843 回答