9

System

Fresh install of codeblocks 12.11 + mingw pack.

  • win7 64
  • gcc 4.7.1
  • gdb 7.5

Example code

Compiled with -g and no optimization.

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

}

Problem

I put a breakpoint on "void foo(int a, int b)" and I look value of b as I step through the 3 lines. Either with the codeblocks debugging features or with the gdb command line, the value of b is 42 instead of being 391. The console output is correct, 391.

GDB commands

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)

Remarks

  • When the same operations are done without a function, with a and b as local variables inside main, the debug output is correct.
  • When compiled with gcc 4.4.1, the debug output is correct.

Any idea what could be wrong ? =)

4

3 回答 3

8

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

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

编译-fvar-tracking允许 GDB 在赋值后打印 b 的正确值。

于 2013-02-07T19:36:21.123 回答
1

gcc 不会为寄存器中的值正确生成调试信息——无论是已放入寄存器中的值还是由于调用约定而从那里开始的值。从至少 4.0 开始,这是 gcc 的一个长期存在的问题,并且使调试变得很棘手。

于 2013-02-06T22:17:45.090 回答
0

有时优化器比调试器更聪明。尝试调试未优化的代码,或者逐步反汇编并直接观察硬件寄存器,而不是逐步通过 C 源代码行并观察调试器对变量的概念。

于 2013-02-06T16:38:23.563 回答