GDB: przerwij, jeśli zmienna ma równą wartość

89

Lubię, gdy GDB ustawia punkt przerwania, gdy zmienna równa się pewnej wartości, którą ustawiłem, próbowałem tego przykładu:

#include <stdio.h>
main()
{ 
     int i = 0;
     for(i=0;i<7;++i)
        printf("%d\n", i);

     return 0;
}

Wyjście z GDB:

(gdb) break if ((int)i == 5)
No default breakpoint address now.
(gdb) run
Starting program: /home/SIFE/run 
0
1
2
3
4
5
6

Program exited normally.
(gdb)

Jak widzisz, GDB nie dokonał żadnego punktu przerwania, czy jest to możliwe w przypadku GDB?

SIFE
źródło

Odpowiedzi:

123

Oprócz punktu obserwacyjnego zagnieżdżonego w punkcie przerwania możesz również ustawić pojedynczy punkt przerwania w polu „nazwa_pliku: numer_linii” i użyć warunku. Czasami jest mi łatwiej.

(gdb) break iter.c:6 if i == 5
Breakpoint 2 at 0x4004dc: file iter.c, line 6.
(gdb) c
Continuing.
0
1
2
3
4

Breakpoint 2, main () at iter.c:6
6           printf("%d\n", i);

Jeśli tak jak ja znudzi Cię zmiana numerów wierszy, możesz dodać etykietę, a następnie ustawić punkt przerwania na etykiecie w następujący sposób:

#include <stdio.h>
main()
{ 
     int i = 0;
     for(i=0;i<7;++i) {
       looping:
        printf("%d\n", i);
     }
     return 0;
}

(gdb) break main:looping if i == 5
matowe
źródło
30

Możesz użyć do tego punktu obserwacyjnego (punkt przerwania danych zamiast kodu).

Możesz zacząć od użycia watch i.
Następnie ustaw warunek za pomocącondition <breakpoint num> i == 5

Możesz uzyskać numer punktu przerwania za pomocą info watch

jestem prawdziwy
źródło
3
(gdb) watch i No symbol "i" in current context.
SIFE
2
Musisz znajdować się w miejscu w kodzie, w którym iistnieje. Spróbuj break main, run, c, s(krok, aby upewnić się ominąć deklaracji), a następnie polecenia na odpowiedź. Pamiętaj, aby skompilować swój program z -gflagą. (tj. z informacjami o debugowaniu)
imreal
Przed rozpoczęciem wykonywania inne jednostki / pliki kompilacji połączone z głównym plikiem wykonywalnym mogą jeszcze nie zostać załadowane. Opcja ładne jest następnie użyć start <args>, który jest podobny tb main, run <args>. Spowoduje to uruchomienie programu, umożliwiając łatwiejsze ustawianie punktów przerwania / oglądania.
JWCS
9

Najpierw musisz skompilować swój kod z odpowiednimi flagami, umożliwiając debugowanie w kodzie.

$ gcc -Wall -g -ggdb -o ex1 ex1.c

następnie po prostu uruchom kod za pomocą swojego ulubionego debuggera

$ gdb ./ex1

pokaż mi kod.

(gdb) list
1   #include <stdio.h>
2   int main(void)
3   { 
4     int i = 0;
5     for(i=0;i<7;++i)
6       printf("%d\n", i);
7   
8     return 0;
9   }

przerwa w liniach 5 i wygląda, czy i == 5.

(gdb) b 5
Breakpoint 1 at 0x4004fb: file ex1.c, line 5.
(gdb) rwatch i if i==5
Hardware read watchpoint 5: i

sprawdzanie punktów przerwania

(gdb) info b
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x00000000004004fb in main at ex1.c:5
    breakpoint already hit 1 time
5       read watchpoint keep y                      i
    stop only if i==5

uruchomienie programu

(gdb) c
Continuing.
0
1
2
3
4
Hardware read watchpoint 5: i

Value = 5
0x0000000000400523 in main () at ex1.c:5
5     for(i=0;i<7;++i)
Alexandre Mulatinho
źródło
4

Istnieją punkty obserwacyjne dotyczące sprzętu i oprogramowania. Służą do czytania i pisania zmiennej. Musisz zapoznać się z samouczkiem:

http://www.unknownroad.com/rtfm/gdbtut/gdbwatch.html

Aby ustawić punkt obserwacyjny, najpierw musisz złamać kod w miejscu, w którym varianle i jest obecny w środowisku, i ustawić punkt obserwacyjny.

watchPolecenie służy do ustawiania punktu obserwacyjnego do pisania, podczas rwatchczytania i awatchdo czytania / pisania.

alinsoar
źródło