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