GDB打印错误的值

时间:2012-04-25 12:17:29

标签: c++ debugging gdb

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

当我使用print object.member时,它并不总是正确打印变量的值。相反,它打印我正在调试的函数的一个参数的值。虽然我在整个过程中更改了object.member的值,但它并没有因函数而改变。

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

所以我可以问的是,有没有人在GDB中看到过这种行为,你有没有找到导致它的原因以及如何解决它?

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

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

1 个答案:

答案 0 :(得分:0)

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

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

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

您可以在代码中创建对此变量的引用并尝试显示该变量吗?或者获取变量的地址并对内容进行解除 - 只有当它公开时才可用。

自然,源代码必须匹配你编译的内容,所以必须比exe早,但gdb通常会警告你这些事情