2

我在使用 GDB 调试 C++ 程序时遇到了一些问题。

当我使用print object.member时,它并不总是正确打印变量的值。相反,它将一个参数的值打印到我正在调试的函数中。它不会通过函数改变,尽管我改变了object.member整个的值。

问题是,这个程序相当大,由几个模块组成,有部分专门的模板等,所以我不能在这里全部发布。
现在我尝试创建一个最小的测试用例,但无论我尝试多么简单,我都无法让它工作。我的意思是,不工作。

所以我能问的是,有没有人在 GDB 中看到过这种行为,你有没有发现它是什么原因造成的以及如何解决它?

这里有关于类似行为的问题,但这些问题相当于程序没有正确编译(优化级别太高等)。我用 编译它-Wall -Wextra -pedantic -g -O0,所以不能这样。

程序运行良好;我可以cout << object.member;并且输出预期值,所以我不知道现在该尝试什么。

4

1 回答 1

0

我以前见过类似的行为。不幸的是,gdb 确实是基于“C”的,所以虽然它会处理 C++,但我发现它偶尔对显示值非常挑剔。

当显示更复杂的项目(例如映射、字符串或智能指针的取消引用内容)时,您有时必须非常明确地取消引用和强制转换变量。

另一种可能性是函数本身——它有什么不寻常的地方吗?例如,它是模板化的吗?

您可以在代码中创建对此变量的引用并尝试显示它吗?或者获取变量的地址并取消对内容的引用——当然,前提是它是公开可用的。

自然,源代码必须与您编译的内容相匹配,因此必须比 exe 旧,但 gdb 通常会警告您此类事情

于 2012-04-25T12:31:43.847 回答