2009-05-13 7 views
5

A volte accumulo una grande massa di punti di interruzione da diverse sessioni di debug in diversi punti del mio codice. Come fa il debugger a sapere in modo efficiente quando fermarsi per un breakpoint? Non è possibile che si fermi su ogni singola riga per controllare il numero di riga e il nome del file sorgente rispetto a una lista potenzialmente lunga di punti di interruzione, vero?Come vengono implementati i punti di interruzione del debugger in modo efficiente?

Questo è il debugger Java in Eclipse, ma presumo che la domanda si applichi a qualsiasi debugger.

risposta

7

La strategia utilizzata in molti debugger (non so su Eclipse) consiste nel mettere una patch nel codice nel punto del breakpoint che è essenzialmente una chiamata di subroutine o di sistema. Il codice è saltato per avere le informazioni sul punto di interruzione, e fa qualunque sia la stampa o l'accettazione dei comandi dell'utente, e ha anche il codice che è stato sovrascritto con la patch, in modo che il codice possa essere eseguito per far corrispondere l'esecuzione al codice originale, senza il punto di interruzione

+0

L'uomo, che è un po 'di magia pesanti. Sapevo che i debugger stavano facendo delle cose profonde, ma non sapevo che fosse così profondo! – skiphoppy

+2

Non necessariamente una chiamata anche. Ove possibile, si sovrascrive con un'istruzione che solleva un interrupt, gestito dal debugger. –

5

per aggiungere alla buona risposta del Nadreck:

C'è un articolo here con più dettagli, tra cui alcune delle cose più esotico (codici operativi specifici su x86; breakpoints hardware).

2

I debugger implementano i breakpoint in hardware o software. Quest'ultimo richiede il salvataggio dell'istruzione originale, l'inserimento di un codice speciale che genera un'eccezione e quando l'eccezione viene sollevata, reinserendo l'istruzione originale e facendo sapere all'utente che il punto di interruzione è stato raggiunto. Leggi my article per i dettagli sanguinosi sui breakpoint del software.