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

Tey*_*beo 9 c gdb

系统

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

  • win7 64
  • gcc 4.7.1
  • gdb 7.5

示例代码

用-g编译,没有优化.

#include <stdio.h>

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);

}
Run Code Online (Sandbox Code Playgroud)

问题

我在"void foo(int a,int b)"上设置了一个断点,当我逐步完成3行时,我看起来是b的值.无论是使用代码块调试功能还是使用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 <http://gnu.org/licenses/gpl.html>
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:  
<http://www.gnu.org/software/gdb/bugs/>.
(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)
Run Code Online (Sandbox Code Playgroud)

备注

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

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

Tey*_*beo 8

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

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

编译-fvar-tracking允许GDB在分配后打印b的正确值.