Как я могу использовать "смотреть" GDB? - PullRequest
8 голосов
/ 07 мая 2009

Я пытался наблюдать за изменением «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; 
 }

Ответы [ 3 ]

11 голосов
/ 09 мая 2009

Может помочь указать вашу платформу, версию 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
3 голосов
/ 10 июня 2009

Когда вы хотите отлаживать программу, вы всегда должны собирать ее с -O0 -g3 (я полагаю, что вы используете gcc, если вы не используете компилятор, вероятно, будут поддерживать другие флаги для отключения оптимизации и включения отладочной информации).

В моей системе (x86_64 под управлением Gentoo GNU / Linux) я не могу попасть в строку 'int a = 12', когда использую какую-либо оптимизацию, большую или равную -O, так как компилятор применит мертвый код ликвидация . (Взято из здесь , это флаг -fdce в разделе -O)

Всегда имейте это в виду при отладке! Проверьте ваш код, либо разобрав его с помощью objdump -D, либо попросите компилятор показать вам сгенерированную сборку (на gcc с флагом -S)

1 голос
/ 07 мая 2009

Компилятор, вероятно, даже не генерирует код для присвоения 12 "a", было бы неплохо разобрать сгенерированный код для подтверждения. Возможно, вам понадобится немного более сложный тест, чтобы попробовать это.

...