2011-06-24 8 views
4

セグメンテーションフォールトを持つCアプリケーションをデバッグしています。私はすでに問題を引き起こす変数を特定しました。しかし、セグメンテーションフォルトが発生するように変数が割り当てられているのはまだ分かりません。GDB:シンボルの変更にブレークポイントを割り当てる

新しい値が既存の変数に割り当てられている場合、GDBにブレークポイントを設定する方法はありますか?

答えて

5

あなたはwatchpointが必要です

(gdb) watch my_var 
5
#include <stdio.h> 

struct foo { 
    int i[12]; 
    int j; 
}; 

int main(void) { 
    struct foo foo = {{0}}; 
    int *p; 

    p = foo.i; 
    p[12] = 42; 
    printf("j is %d\n", foo.j); 
    return 0; 
} 
 
gdb ./a.out 
[...] 
Reading symbols from a.out...done. 
(gdb) break main 
Breakpoint 1 at 0x40052c: file 6469109.c, line 9. 
(gdb) run 
Starting program: a.out 

Breakpoint 1, main() at 6469109.c:9 
9   struct foo foo = {{0}}; 
(gdb) watch foo.j 
Hardware watchpoint 2: foo.j 
(gdb) cont 
Continuing. 
Hardware watchpoint 2: foo.j 

Old value = -7936 
New value = 0 
0x0000000000400545 in main() at 6469109.c:9 
9   struct foo foo = {{0}}; 
(gdb) cont 
Continuing. 
Hardware watchpoint 2: foo.j 

Old value = 0 
New value = 42 
main() at 6469109.c:14 
14  printf("j is %d\n", foo.j); 
(gdb) quit 
A debugging session is active. 

     Inferior 1 [process 572] will be killed. 

Quit anyway? (y or n) y 
+0

1:私はprogrammaticalエラーを通じて 'foo.j'の変更を見ての例が好き。私は+2これを行うことができたらいいと思う。 – dolphy

関連する問題