修改参数时gdb打印错误的值

系统

全新安装的代码块12.11 + mingw pack。

  • win7 64
  • gcc 4.7.1
  • gdb 7.5

示例代码

用-g编译,没有优化。

#include  void foo(int a, int b); int main() { foo(400, 42); return 0; } void foo(int a, int b) { a = a - 10; b = a + 1; printf("y2 %d\n", b); } 

问题

我在“void foo(int a,int b)”上放了一个断点,当我逐步浏览3行时,我看起来是b的值。 无论是使用代码块调试function还是使用gdb命令行, b的值都是42而不是391 。 控制台输出正确,391。

GDB命令

 C:\DebugTest>"C:\Program Files (x86)\CodeBlocks\MinGW\bin\gdb.exe" GNU gdb (GDB) 7.5 Copyright (C) 2012 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later  This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "i686-pc-mingw32". For bug reporting instructions, please see: . (gdb) file bin/Debug/DebugTest.exe Reading symbols from C:\DebugTest\bin\Debug\DebugTest.exe...done. (gdb) break foo Breakpoint 1 at 0x401363: file C:\DebugTest\main.c, line 14. (gdb) run Starting program: C:\DebugTest\bin\Debug\DebugTest.exe [New Thread 3596.0x658] Breakpoint 1, foo (a=400, b=42) at C:\DebugTest\main.c:14 14 a = a - 10; (gdb) print b $1 = 42 (gdb) step 15 b = a + 1; (gdb) print b $2 = 42 (gdb) step 17 printf("y2 %d\n", b); (gdb) print b $3 = 42 (gdb) 

备注

  • 没有函数完成相同的操作时 ,在main中使用a和b作为局部变量,调试输出是正确的
  • 使用gcc 4.4.1编译时,调试输出是正确的

知道什么可能是错的吗? =)

我搜索了gcc bugzilla并发现了这个错误报告:

  • 错误54218 – 使用-O0编译时,函数参数的调试信息不​​正确“

虽然报告是关于gcc 4.8而我正在使用4.7,但我尝试了建议的解决方法并且它有效!

使用-fvar-tracking进行编译允许GDB在分配后为b打印正确的值。

gcc不会为寄存器中的值正确生成调试信息 – 已放入寄存器的值或由于调用约定而在那里启动的值。 这是gcc至少4.0的一个长期存在的问题,并且调试事情变得棘手。

有时优化器比调试器更智能。 尝试调试未经优化的代码,或者直接进行反汇编并直接观察硬件寄存器,而不是单步执行C源代码行并观察调试器对变量的概念。