9

システム

コードブロック12.11+mingwパックの新規インストール。

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

}

問題

「voidfoo(int a、int b)」にブレークポイントを設定し、3行をステップ実行するときにbの値を確認します。コードブロックのデバッグ機能またはgdbコマンドラインのいずれかを使用すると、bの値は391ではなく42になります。コンソール出力は正しい、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)

備考

  • aとbをmain内のローカル変数として、関数なし同じ操作を実行すると、デバッグ出力は正しくなります。
  • gcc 4.4.1でコンパイルすると、デバッグ出力は正しくなります。

何が間違っている可能性があるか考えていますか?=)

4

3 に答える 3

8

gcc bugzillaで検索したところ、このバグレポートが見つかりました:

代わりに、レポートはgcc 4.8についてであり、私は4.7を使用しています。提案された回避策を試しましたが、機能します。

withをコンパイルすると-fvar-tracking、GDBは割り当て後にbの正しい値を出力できます。

于 2013-02-07T19:36:21.123 に答える
1

gccは、レジスターにある値(呼び出し規約のためにレジスターに入れられた値またはそこから始まる値)のデバッグ情報を正しく生成しません。これは、少なくとも4.0以降のgccでの長年の問題であり、デバッグが難しくなります。

于 2013-02-06T22:17:45.090 に答える
0

オプティマイザーはデバッガーよりも賢い場合があります。最適化されていないコードをデバッグするか、Cソース行をステップスルーして変数が何であるかをデバッガーが認識するのではなく、逆アセンブルをステップ実行してHWレジスターを直接監視してみてください。

于 2013-02-06T16:38:23.563 に答える