不遵循构造函数中的局部变量。这是gdb中的错误吗?

时间:2008-10-22 00:45:23

标签: c++ debugging gdb

我目前在Ubuntu Linux上运行gdb版本6.7.1,并在C ++项目中工作。

令人惊讶的是我试图调试一个构造函数,并且我发现gdb没有遵循或注意到在构造函数范围内声明的局部变量。这是一个错误吗?

感谢您提供任何信息..

3 个答案:

答案 0 :(得分:5)

GCC中的bug,而不是GDB。

最近fixed

答案 1 :(得分:2)

如果您正在使用优化(-O),请将其禁用(删除-O或使用-O0)。编译器有时太聪明了,猜测它不需要的变量,在编译时进行计算,更改变量的范围或其他几个技巧。

请注意,即使使用“无优化”,仍然会进行一些简单的优化,但它们不应干扰调试。此外,通过大量使用C ++(包括STL),您的程序可以在没有优化的情况下变慢。

答案 2 :(得分:2)

听起来您正在调试优化版本。

调试器“知道”局部变量的值,因为符号文件描述了它们在函数堆栈帧中的位置。

然后,调试器可以从目标进程的内存中读取变量。但是,这要求堆栈帧包含局部变量的最新副本。在没有优化的情况下进行编译时,生成的代码将始终在每次修改时将局部变量写回其堆栈帧位置。这使得调试变得简单,但在运行时却是成本。

对于优化构建,编译器会经常推断出这些步骤是不必要的,并且只要需要就在CPU寄存器中保留一个值。很可能局部变量永远不会得到写入堆栈的值。在这种情况下,调试器无法跟踪变量的值,但也不知道这一点,并且通常会报告堆栈中的数据,就像它是变量值一样。

相关问题