操纵C++;GDB中以$开头的成员变量 我使用C++代码库,使用非常特殊的编码风格,包括用“$”类预先定义成员变量。对于那些以前从未遇到过的人来说,它不是正式的C++标准的一部分,但是.
作为我所说的一个例子:操纵C++;GDB中以$开头的成员变量 我使用C++代码库,使用非常特殊的编码风格,包括用“$”类预先定义成员变量。对于那些以前从未遇到过的人来说,它不是正式的C++标准的一部分,但是.,c++,debugging,gcc,gdb,C++,Debugging,Gcc,Gdb,作为我所说的一个例子: #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; } #包括 类T{public:in
#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;
}
#包括
类T{public:int$x;int y;};
int main()
{
T*T=新的T();
t->$x=t->y=42;
std::cout y
运行正常。pt->$x
返回语法错误,可能希望$引用便利变量
理想情况下,我会把$s全部去掉,然后在剩下的日子里寻找那些认为这是个好主意的人(特别是对于现代的代码库)。这不现实,但我仍然需要能够使用GDB进行调试
我希望有一个神奇的逃脱角色,但我所寻找或尝试的都没有成功
示例:
p此->'\044描述者'
p此->“$descriptor”
p此->“$”描述符
p此->\$descriptor
p此->\\$描述符
p此->“\$descriptor”
p此->“\\044描述者”
p此->$$描述符
p此->“$$descriptor”
p this->getDescriptor()
)。一个更难看的解决方法是打印整个类的内容(p*this
)。我不确定是否可以无限期地依赖这两个函数;有些类相当大,大多数成员变量都没有getter
这可能被归类为GDB中的一个bug,这取决于翻录输入以支持它是否是一个好主意。然而,即使它已修复,对于给定的体系结构/构建环境,我仍然坚持使用GDB 7.2
有什么想法吗
更新:
python import gdb;print(gdb.parse_and_eval(“t”)['$x'])
如果您有python内置(很遗憾,我没有),则注释中会建议您使用它。如果您有带有python扩展的gdb版本,则“探索”功能可能会有所帮助
看
因为您不需要变量名,所以应该能够绕过“$”问题。向后兼容性是邪恶的,不是吗?代码库是否在github这样的存储库中积极维护?这可以在源代码中清理,或者在存储库中更新,或者您可以在那里分叉并清理它吗?如果您一直使用GDB被这绊倒了,这可能是你最好的选择……尽管以小时计算这样做的成本。你是否尝试使用
$
来逃避它?这是一个专有的代码库,最近通过收购的方式引入我的公司。我试图证明,这是值得重构的怪癖。我使用了它的双重论点值得重构的怪癖是,这段代码已经有五年了……为什么?而且,$$也不起作用;我将把它添加到列表中。试试(gdb)python import gdb;print(gdb.parse_and_eval(“t”)['$x'])
。
(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: