【问题标题】:Manipulating C++ member variables that begin with $ in GDB在 GDB 中操作以 $ 开头的 C++ 成员变量
【发布时间】:2015-05-13 19:17:07
【问题描述】:

我正在使用具有非常特殊编码风格的 C++ 代码库,包括在类中使用“$”作为成员变量的前缀。对于以前从未遇到过此问题的任何人,它不是 C++ 标准的正式组成部分,而是 lurks around for backwards compatibility

作为我所说的一个例子:

#include <iostream>

class T { public: int $x; int y; };

int main()
{
  T *t = new T();
  t->$x = t->y = 42;
  std::cout << "t->$x = " << t->$x << std::endl;
  delete t;
  return 0;
}

这在 GDB 中引入了一个问题。 GDB 通常使用 $ 前缀变量作为一个神奇的便利变量(例如引用以前的值)。启动 GDB,在 cout 语句处设置断点,然后尝试打印 t-&gt;$x

p t 运行良好。 p *t 运行良好。 p t-&gt;y 运行良好。 p t-&gt;$x 返回一个语法错误,大概是期望 $ 引用一个便利变量。

理想情况下,我会完全去掉 $s,然后在余下的时间里寻找任何认为这是个好主意的人(尤其是对于现代代码库)。这不现实,但我仍然需要能够使用 GDB 进行调试。

我希望有一个魔术转义字符,但我搜索或尝试过的任何东西都没有奏效。

例子:

  • p this-&gt;'\044descriptor'
  • p this-&gt;'$descriptor'
  • p this-&gt;'$'descriptor
  • p this-&gt;\$descriptor
  • p this-&gt;\\$descriptor
  • p this-&gt;'\$descriptor'
  • p this-&gt;'\\044descriptor'
  • p this-&gt;$$descriptor
  • p this-&gt;'$$descriptor'

等等。

在这种特殊情况下,我可以运行 getter 函数 (p this-&gt;getDescriptor())。一个更丑陋的解决方法是打印整个课程内容 (p *this)。我不确定我是否可以无限期地依赖这两者。有些类相当大,而且大多数成员变量没有 getter。

这可能会被归类为 GDB 中的错误,具体取决于删除输入以支持这一点是否是个好主意。但是,即使它已修复,对于给定的架构/构建环境,我仍停留在 GDB 7.2 上。

有什么想法吗?

更新:python import gdb; print (gdb.parse_and_eval("t")['$x']) 如果您有内置 python(很遗憾,我没有),评论中的建议有效。

【问题讨论】:

  • 向后兼容是邪恶的,不是吗?
  • 代码库是否在 github 等存储库上积极维护?这可以在源代码中清理,也许在存储库中更新,或者你可以分叉并在那里清理它吗?如果你被 GDB 绊倒了,那可能是你最好的选择....尽管计算成本以小时为单位。
  • 你试过用$$转义吗?
  • 这是一个专有代码库,最近通过收购引入我的公司。我正在努力证明我的理由是值得重构那个怪癖。我使用的双重论点是值得重构 Quirk Out 和 Srsly 这个代码就像五年前一样......为什么?此外, $$ 也不起作用;我会把它添加到列表中。
  • 试试(gdb) python import gdb; print (gdb.parse_and_eval("t")['$x'])

标签: c++ debugging gcc gdb


【解决方案1】:

如果你有带有 python 扩展的 gdb 版本,也许“探索”功能会有所帮助。

https://sourceware.org/gdb/onlinedocs/gdb/Data.html#Data


  (gdb) explore cs
     The value of `cs' is a struct/class of type `struct ComplexStruct' with
     the following fields:

       ss_p = 
        arr = 

     Enter the field number of choice:

由于您不需要变量名,您应该能够绕过“$”问题。

【讨论】:

    猜你喜欢
    • 2021-05-18
    • 2012-06-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-29
    • 2011-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多