GDB 打印错误的值

GDB prints wrong values

本文关键字:错误 打印 GDB      更新时间:2023-10-16

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

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

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

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

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

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

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

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

另一种可能性是功能本身 - 它有什么不寻常的吗?例如,它是模板化的吗?

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

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