2012-04-16 7 views
7

Sto utilizzando gdb-7.0.1 e penso di aver rilevato un errore in una determinata sezione del mio codice, che ha un ciclo for. Il ciclo for sembraContinua un'iterazione in C++ fino a un numero di iterazione specifico in gdb

for (int i=0 ; i< end ; ++i) 
{ 
    //Code here. 
} 

Qui end è un molto grande numero intero. Il codice non si arresta in modo anomalo alla prima iterazione e sembra bloccarsi da qualche parte al numero di iterazione end/2.

Dal momento che vorrei capire il comportamento del codice a ripetizione numero end/2, basta stepping e nexting da i=0 finché non arrivare a questo punto di iterazione, è irrealizzabile.

C'è un modo per dire gdb per proseguire attraverso un ciclo for fino i ottiene il valore end/2 e quindi attendere che l'utente al passo manualmente attraverso il numero di iterazioni end/2?

Sto usando gcc-4.5.2 su Ubuntu Linux

+0

http://blog.vinceliu.com/2009/07/gdbs-conditional-breakpoints.html –

risposta

5

Quando si imposta il punto di interruzione si otterrà un numero di punto di interruzione (per il momento, assumiamo che sia 1). Otterrai quindi quel punto di interruzione condizionale, ad esempio:

condition 1 i==end/2 
1

si dovrebbe essere in grado di effettuare un if (i == (end/2 -1)) { Foo; } in là quindi impostare un punto di interruzione Foo, che permetterebbe di continuare a fare un passo da lì.

+0

+1 come questo era il mio metodo fino a quando non ho trovato i punti di interruzione condizionali come suggerisce @LuchianGrigore. –

+0

Grazie, sì, non sono abbastanza fluente in gdb per averlo preso in considerazione. Immaginai che fosse una soluzione sufficientemente generica da lasciar perdere anche di fronte a quelli più toccanti. –

6

Ecco un tutorial su conditional breakpoints con gdb.

Suppongo che tu non conoscessi il termine per questo, altrimenti sarebbe stato facile da google.

+0

Un'altra alternativa è '(gdb) ignora fine/2-1' –

1

Se end è grande (in decine di migliaia), allora il condizionale soluzione di breakpoint può essere molto lenta - gdb deve valutare la condizione ogni volta intorno al ciclo. Se questo è un problema per voi, allora si può usare questo trucco:

for (int i=0 ; i< end ; ++i) 
{ 
    if (i == end/2) 
     i %= end ; // This has no effect, but lets you set a breakpoint here 
    //Code here. 
} 

Lo faccio tutto il tempo :-)

Un'altra soluzione è quella di impostare un salto conteggio sul punto di interruzione. Io uso gdb in un ambiente Qt, quindi non posso darti la sintassi gdb. Ma è più veloce di una condizione.

Problemi correlati