Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
操纵C++;GDB中以$开头的成员变量 我使用C++代码库,使用非常特殊的编码风格,包括用“$”类预先定义成员变量。对于那些以前从未遇到过的人来说,它不是正式的C++标准的一部分,但是._C++_Debugging_Gcc_Gdb - Fatal编程技术网

操纵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”
等等

在这种情况下,我可以运行getter函数(
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: