8

「watch a」コマンドで「int a」の変化を見てみました。しかし、プログラムは 12 に変わっても停止しません。なぜですか?

 /* FILE: test.c */
 #include <stdio.h>
 #include <stdlib.h>

 int main(int argc, char** argv){
  printf("Hello world\n");

  int a = 12;
  a = 10;                                                                                                                                                                      
  return 0; 
 }
4

3 に答える 3

11

プラットフォーム、GDB のバージョン、および使用した GDB コマンドの正確な順序を指定すると役立つ場合があります。

これが私が見ているものです(GDBは問題なく動作しているようです):

$ gcc -g test.c

$ gdb a.out
GNU gdb (GDB) 6.8.50.20090430-cvs
Copyright (C) 2009 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 "x86_64-unknown-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
(gdb) list
1       #include <stdio.h>
2       #include <stdlib.h>
3
4       int main(int argc, char** argv){
5         printf("Hello world\n");
6
7         int a = 12;
8         a = 10;                                                                                                                                                                      
9         return 0; 
10      }
11
(gdb) b 5
Breakpoint 1 at 0x4004a7: file test.c, line 5.
(gdb) r

Breakpoint 1, main (argc=1, argv=0x7fffffffdb28) at test.c:5
5         printf("Hello world\n");
(gdb) watch a
Hardware watchpoint 2: a
(gdb) c
Hello world
Hardware watchpoint 2: a

Old value = 0
New value = 12
main (argc=1, argv=0x7fffffffdb28) at test.c:8
8         a = 10;                                                                                                                                                                      
(gdb) c
Hardware watchpoint 2: a

Old value = 12
New value = 10
main (argc=1, argv=0x7fffffffdb28) at test.c:9
9         return 0; 
(gdb) c

Watchpoint 2 deleted because the program has left the block in
which its expression is valid.
0x00007ffff7ab3033 in exit () from /lib/libc.so.6
(gdb) c

Program exited normally.
(gdb) q
于 2009-05-09T02:08:03.053 に答える
3

プログラムをデバッグする場合は、常に -O0 -g3 を使用してビルドする必要があります (gcc を使用していない場合、コンパイラは最適化を無効にしてデバッグ情報を有効にする他のフラグをサポートする可能性があります)。

私のシステム (Gentoo GNU/Linux を実行している x86_64) では、-O 以上の最適化を使用すると、「int a = 12」行に到達できません。これは、コンパイラがデッド コードの削除を適用するためです。(ここから取得、-O セクションの -fdce フラグです)

デバッグするときは、常にこれを念頭に置いてください。objdump -D で逆アセンブルしてコードを検証するか、生成されたアセンブリを表示するようコンパイラに指示します (gcc で -S フラグを使用)。

于 2009-06-10T11:48:49.250 に答える
1

コンパイラは "a" に 12 を代入するコードを生成していない可能性が高いため、生成されたコードを逆アセンブルして確認することをお勧めします。これを試すには、おそらくもう少し複雑なテストが必要です。

于 2009-05-07T16:41:48.483 に答える