可读格式的 GDB 打印变量(使用 << 运算符)
Posted
技术标签:
【中文标题】可读格式的 GDB 打印变量(使用 << 运算符)【英文标题】:GDB print variable in readable format (using << operator) 【发布时间】:2021-07-13 13:37:25 【问题描述】:GDB 是一个不错的工具,但就我目前为止使用它的方式而言,一旦处理更复杂的数据结构,它就会变得毫无用处,因为在它们上简单地使用 print
只会让整个屏幕充满不可读有关该课程的详细信息。
但是,我通常为我的类定义一个自定义 operator<<
,以便为我的类创建一个(或多或少)可读的字符串表示形式。
因此,如果 GDB 总是使用它(如果可用)而不是其默认的打印行为,我会更喜欢。
我找到了 2010 年的 this question,它描述了如何手动调用 operator<<
。除了做起来有点乏味之外,我还没有让这些为我工作(我总是得到No symbol "operator<<" in current context.
)。
但是在我看来,好像必须有一种更方便的方法让 GDB 以可读格式打印变量。毕竟我不可能是第一个遇到这种情况的人。
因此我的问题是:如何让 GDB 以可读格式打印变量(最好使用在相应类型中实现的 operator<<
)?
我发现的链接问题来自 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
转储,这显然不是问题,但迟早您可能不得不这样做,然后您无论如何都需要复制代码。
【讨论】:
我什至不知道我可以在core
dumps xD 上使用gdb 在我的情况下,我真的只想在程序的常规调试期间以可读的格式显示我的变量。海事组织很遗憾,这似乎没有得到真正的支持。但无论如何,谢谢 - 也许我可以编写一些 Python 代码来自动提取我的 operator<<
实现并基于它生成一个漂亮的打印机......
澄清一下:我不得不复制漂亮打印机的最大问题是,在处理未完成的代码时,字符串表示可能不得不再次更改。然后我必须维护两个版本的漂亮打印机,当我只想能够正确调试我的程序时,这只是一个非常烦人的维护开销。以上是关于可读格式的 GDB 打印变量(使用 << 运算符)的主要内容,如果未能解决你的问题,请参考以下文章