我目前在Ubuntu Linux上运行gdb版本6.7.1,并在C ++项目中工作。
令人惊讶的是我试图调试一个构造函数,并且我发现gdb没有遵循或注意到在构造函数范围内声明的局部变量。这是一个错误吗?
感谢您提供任何信息..
答案 0 :(得分:5)
答案 1 :(得分:2)
如果您正在使用优化(-O),请将其禁用(删除-O或使用-O0)。编译器有时太聪明了,猜测它不需要的变量,在编译时进行计算,更改变量的范围或其他几个技巧。
请注意,即使使用“无优化”,仍然会进行一些简单的优化,但它们不应干扰调试。此外,通过大量使用C ++(包括STL),您的程序可以在没有优化的情况下变慢。
答案 2 :(得分:2)
听起来您正在调试优化版本。
调试器“知道”局部变量的值,因为符号文件描述了它们在函数堆栈帧中的位置。
然后,调试器可以从目标进程的内存中读取变量。但是,这要求堆栈帧包含局部变量的最新副本。在没有优化的情况下进行编译时,生成的代码将始终在每次修改时将局部变量写回其堆栈帧位置。这使得调试变得简单,但在运行时却是成本。
对于优化构建,编译器会经常推断出这些步骤是不必要的,并且只要需要就在CPU寄存器中保留一个值。很可能局部变量永远不会得到写入堆栈的值。在这种情况下,调试器无法跟踪变量的值,但也不知道这一点,并且通常会报告堆栈中的数据,就像它是变量值一样。