GDB: interruzione se variabile uguale valore


89

Mi piace fare in modo che GDB imposti un punto di interruzione quando una variabile è uguale a un valore che ho impostato, ho provato questo esempio:

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

     return 0;
}

Uscita da 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)

Come vedi, GDB non ha creato alcun punto di rottura, è possibile con GDB?

Risposte:


123

oltre a un punto di controllo annidato all'interno di un punto di interruzione, puoi anche impostare un singolo punto di interruzione su 'filename: line_number' e utilizzare una condizione. A volte lo trovo più facile.

(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);

Se come me ti stanchi di cambiare i numeri di riga, puoi aggiungere un'etichetta quindi impostare il punto di interruzione sull'etichetta in questo modo:

#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

30

È possibile utilizzare un punto di controllo per questo (un punto di interruzione sui dati invece del codice).

Puoi iniziare usando watch i.
Quindi impostare una condizione per l'utilizzocondition <breakpoint num> i == 5

È possibile ottenere il numero del punto di interruzione utilizzando info watch


3
(gdb) watch i No symbol "i" in current context.
SIFE

2
Devi essere in un posto nel codice dove iesiste. Provate break main, run, c, s(passo per essere sicuri di andare oltre la dichiarazione), e quindi i comandi la risposta. Assicurati di compilare il tuo programma con il -gflag. (cioè con informazioni di debug)
imreal

Prima dell'avvio dell'esecuzione, altre unità / file di compilazione collegati all'eseguibile principale potrebbero non essere ancora caricati. Un'opzione ingegnoso è quella di utilizzare, allora start <args>, che è come tb main, run <args>. Questo avvierà il programma, permettendoti di impostare più facilmente i punti di pausa / osservazione.
JWCS

9

Innanzitutto, è necessario compilare il codice con i flag appropriati, abilitando il debug nel codice.

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

quindi esegui il codice con il tuo debugger preferito

$ gdb ./ex1

mostrami il codice.

(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   }

interrompi le righe 5 e guarda se 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

controllo dei punti di interruzione

(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

eseguire il programma

(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)

4

Ci sono punti di osservazione hardware e software. Servono per leggere e scrivere una variabile. Devi consultare un tutorial:

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

Per impostare un watchpoint, prima devi suddividere il codice in un punto in cui la variante i è presente nell'ambiente e impostare il watchpoint.

watchcomando viene utilizzato per impostare un watchpoit per la scrittura, rwatchper la lettura e awatchper la lettura / scrittura.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.