「ウォッチ」GDBを使用するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/835757

  •  08-07-2019
  •  | 
  •  

質問

「int a」の変化を監視しようとしました。コマンド「watch 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; 
 }
役に立ちましたか?

解決

プラットフォーム、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

他のヒント

プログラムをデバッグする場合は、常に-O0 -g3を使用してビルドする必要があります(コンパイラを使用していない場合は、gccを使用していると考えてください) / p>

システム(Gentoo GNU / Linuxを実行しているx86_64)では、コンパイラがデッドコードの除去。 (こちらから取得します。これは-fdceフラグです- Oセクション)

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

コンパイラはおそらく「a」に12を割り当てるコードを生成することすらしていないので、生成されたコードを分解して確認することをお勧めします。これを試すには、おそらくもう少し複雑なテストが必要です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top