【发布时间】: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->$x。
p t 运行良好。 p *t 运行良好。 p t->y 运行良好。 p t->$x 返回一个语法错误,大概是期望 $ 引用一个便利变量。
理想情况下,我会完全去掉 $s,然后在余下的时间里寻找任何认为这是个好主意的人(尤其是对于现代代码库)。这不现实,但我仍然需要能够使用 GDB 进行调试。
我希望有一个魔术转义字符,但我搜索或尝试过的任何东西都没有奏效。
例子:
-
p this->'\044descriptor' p this->'$descriptor'p this->'$'descriptorp this->\$descriptor-
p this->\\$descriptor -
p this->'\$descriptor' p this->'\\044descriptor'p this->$$descriptorp this->'$$descriptor'
等等。
在这种特殊情况下,我可以运行 getter 函数 (p this->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'])。