Mac漂亮打印GDB
mac pretty print gdb
我在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 = "mining 00 00v 00 00 00 00 00 00",
_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.
- 如何使用gdb制作一个可以漂亮地打印每个对象的C++函数
- 如何打印源文件中与 GDB 中的程序流关联的所有行号
- 尝试打印字符串时"Python Exception <class 'gdb.error'> There is no member named _M_dataplus."
- 如何在GDB中按行打印2D数组
- 我如何在GDB中打印十六进制的双重位
- GDB 打印内容:const set<Int4> & var_name
- GDB 在程序运行时打印文件名行号
- gdb ptype 打印整数后缀以指示它是有符号的、无符号的、无符号的长整型等
- GDB打印具有虚拟函数类的非弦乐值的静态常量阵列的无效地址
- GDB打印std ::地图元素
- 在GDB中打印int ** x
- GDB 打印结构的字段
- gdb:打印sockaddr指针值
- 有没有办法让 GDB 打印一些东西来告诉我一行已经执行,而不会停止
- GDB 打印错误的值
- 是否有一种方法可以查看哪个线程正在使用gdb打印标准输出或标准错误?
- 在调试c++程序期间调用round()函数时,GDB打印任意值
- 用GDB打印c++类对象
- 使用GDB打印C++vtables
- 减少gdb打印中的垃圾