可读格式的 GDB 打印变量(使用 << 运算符)

Posted

技术标签:

【中文标题】可读格式的 GDB 打印变量(使用 << 运算符)【英文标题】:GDB print variable in readable format (using << operator) 【发布时间】:2021-07-13 13:37:25 【问题描述】:

GDB 是一个不错的工具,但就我目前为止使用它的方式而言,一旦处理更复杂的数据结构,它就会变得毫无用处,因为在它们上简单地使用 print 只会让整个屏幕充满不可读有关该课程的详细信息。

但是,我通常为我的类定义一个自定义 operator&lt;&lt;,以便为我的类创建一个(或多或少)可读的字符串表示形式。

因此,如果 GDB 总是使用它(如果可用)而不是其默认的打印行为,我会更喜欢。

我找到了 2010 年的 this question,它描述了如何手动调用 operator&lt;&lt;。除了做起来有点乏味之外,我还没有让这些为我工作(我总是得到No symbol "operator&lt;&lt;" in current context.)。

但是在我看来,好像必须有一种更方便的方法让 GDB 以可读格式打印变量。毕竟我不可能是第一个遇到这种情况的人。

因此我的问题是:如何让 GDB 以可读格式打印变量(最好使用在相应类型中实现的 operator&lt;&lt;)? 我发现的链接问题来自 2010 年,因此我希望从那时起情况有所改善。

【问题讨论】:

你试过这种方法吗? ***.com/questions/3832964/calling-operator-in-gdb 我猜 gdb 可以通过客户 python 模块进行扩充(不确定您的版本是否可以).. 或者您可以仅包含在调试中的包装器会调用 ostrem @Rob 如果我没记错的话,您链接的问题与我在帖子中所做的相同...您是指在 c++ 中添加一个使用 operator AFAIK 您可以使用 python 脚本(gdb 有自己的 python 解释器)自定义 gdb(漂亮打印)如何表示某些类型。我从来没有这样做过,但这对你来说应该是一个很好的起点。 sourceware.org/gdb/onlinedocs/gdb/… 这里是可能的duplicate(我不会以骗子的身份投票结束,因为我不完全相信,而且我有特权立即结束话题)。 @Raven 实际上链接工作正常。这是答案部分:我找到的唯一方法是: call 'operator 【参考方案1】:

在我看来,好像必须有一种更方便的方法让 GDB 以可读格式打印变量。

是的:你为他们实现了一个 python 漂亮的打印机。 Documentation.

当我已经在代码中完成时,我希望避免为我的所有课程重写漂亮的打印机。

call PrintMyClass() 解决方案的问题在于它们需要一个正在运行的进程。当您有一个core 转储时,您不能在代码中调用任何函数,因此您需要在程序外部 来漂亮地打印数据。

如果您从不调试 core 转储,这显然不是问题,但迟早您可能不得不这样做,然后您无论如何都需要复制代码。

【讨论】:

我什至不知道我可以在coredumps xD 上使用gdb 在我的情况下,我真的只想在程序的常规调试期间以可读的格式显示我的变量。海事组织很遗憾,这似乎没有得到真正的支持。但无论如何,谢谢 - 也许我可以编写一些 Python 代码来自动提取我的 operator&lt;&lt; 实现并基于它生成一个漂亮的打印机...... 澄清一下:我不得不复制漂亮打印机的最大问题是,在处理未完成的代码时,字符串表示可能不得不再次更改。然后我必须维护两个版本的漂亮打印机,当我只想能够正确调试我的程序时,这只是一个非常烦人的维护开销。

以上是关于可读格式的 GDB 打印变量(使用 << 运算符)的主要内容,如果未能解决你的问题,请参考以下文章

如何 gdb 如何打印一个地址中的内容

调试利器GDB(下)

x/nfu-用gdb查看内存

gdb调试core文件

跟踪所有变量以执行gdb中的函数

在 GDB 中打印多个变量?