Mac漂亮打印GDB

mac pretty print gdb

本文关键字:GDB 打印 漂亮 Mac      更新时间:2023-10-16

我在macOS High Sierra 10.13.6上,无法让gdb打印漂亮的容器或字符串。 我按照这里的说明使用 gcc-4.8 和 mac os 10.9 打印了 GDB 7.6 STL 漂亮打印,克隆了 gdb 漂亮的打印机并将路径添加到 .gdbinit。 然而,gdb仍然不会很好地打印。 启动gdb后,我添加了漂亮的打印机,以确保它们已注册

(gdb) python
>import sys
>sys.path.insert(0, '/Users/liamadams/Documents/gdb/python')
>from libstdcxx.v6.printers import register_libstdcxx_printers
>register_libstdcxx_printers (None)
>end
Traceback (most recent call last):
  File "<string>", line 4, in <module>
  File "/Users/liamadams/Documents/gdb/python/libstdcxx/v6/printers.py", line 1739, in register_libstdcxx_printers
    gdb.printing.register_pretty_printer(obj, libstdcxx_printer)
  File "/usr/local/Cellar/gdb/8.0.1/share/gdb/python/gdb/printing.py", line 152, in register_pretty_printer
    printer.name)
RuntimeError: pretty-printer already registered: libstdc++-v6
gdb正在

注册漂亮的打印机,我正在运行gcc 8.2.0和gdb 8.0.1。 注册的漂亮打印机是 c++-v6,应该是 v8 吗?我克隆了这个回购以获得漂亮的打印机svn://gcc.gnu.org/svn/gcc/trunk/libstdc++-v3/python

我使用 /usr/local/Cellar/gcc/8.2.0/bin/g++-8 -static-libstdc++ -g -o a.out b.o c.o -pthread 构建了我的代码

这是尝试打印字符串时的 gdb 输出

(gdb) p currentItem
$1 = {static npos = <optimized out>, 
  _M_dataplus = {<allocator<char>> = {<new_allocator<char>> = {<No data fields>}, <No data fields>}, _M_p = 0x7ffeefbff900 "mining"}, _M_string_length = 6, {
    _M_local_buf = "mining0000v000000000000", 
    _M_allocated_capacity = 113723912907117}}
(gdb) whatis currentItem
type = string

尝试使用 -gdwarf-3 进行编译,而不是简单地-g 。根据 https://gcc.gnu.org/onlinedocs/gcc/Debugging-Options.html 的说法,GCC 在 macOS 上默认为 DWARF 版本 2,明确切换到 DWARF 版本 3 会使符号正确出现在 std:: 命名空间中(我还不明白为什么)。因此,您不需要像吴永伟建议的那样修补漂亮的打印机。

这似乎是一个错误。这个堆栈溢出问题中提供了一个黑客解决方案:

gdb libstdc++ 漂亮的打印机中的错误,从 macports (macOS) 安装了 gcc 8

从该问题复制,您需要修改漂亮的打印机代码:

--- python/libstdcxx/v6/printers.py.old 2018-10-13 13:57:11.000000000 +0300
+++ python/libstdcxx/v6/printers.py 2018-10-13 14:35:55.000000000 +0300
@@ -1306,2 +1306,4 @@
     def add(self, name, function):
+        if (name.startswith('std::')):
+            self.add(name[5:], function)
         # A small sanity check.