【问题标题】:GDB printing STL dataGDB 打印 STL 数据
【发布时间】:2014-10-25 20:49:33
【问题描述】:

按照本网站给出的说明进行操作后: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.

【问题讨论】:

    标签: python c++ printing stl gdb


    【解决方案1】:

    加载 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

    【讨论】:

      【解决方案2】:

      从您的回溯来看,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.pdbrcPYTHONSTARTUP 之类的文件,你可能想编写这样的防御性代码)。

      但这很可能只会为您摆脱丑陋的回溯,并且 STL 向量的打印仍然无法正常工作。因为似乎已经有一台漂亮的打印机从其他地方注册了。

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

      【讨论】:

      • 我现在没有收到任何错误,但向量和其他 stl 数据结构仍然被打印为大量无用信息。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-17
      • 1970-01-01
      • 2012-07-21
      • 2018-08-06
      • 1970-01-01
      相关资源
      最近更新 更多