Traccia indietro
La traccia posteriore sta individuando un endpoint a un evento associato alla funzione (vedere di seguito). Una volta lì, un punto di interruzione viene inserito nel debugger. La funzione viene attivata e quando il debugger si arresta. Lo stack di chiamate viene rivisto per tracciare indietro il percorso di chiamata. Mentre si cammina sullo stack di chiamate, è possibile prendere appunti sugli stati variabili o posizionare nuovi punti di interruzione per ispezionare nuovamente l'evento.
La funzione viene nuovamente attivata e il debugger si interrompe nei nuovi punti di interruzione. È quindi possibile ripetere la traccia indietro o eseguire la traccia avanti fino al raggiungimento dell'obiettivo.
Pro e contro
- È sempre più facile camminare nello stack di chiamate e vedere come sei arrivato da qualche parte.
- Potrebbero esserci milioni di condizioni che devono essere vere prima di raggiungere un endpoint. Se conosci già l'endpoint, ti sei risparmiato un sacco di lavoro.
- Se la funzionalità non è attiva. Potresti non raggiungere mai l'endpoint e il tempo può essere sprecato cercando di capire il perché.
Endpoint Discovery
Per eseguire il debug di una funzione devi sapere dove è stato raggiunto l'obiettivo finale nel codice sorgente. Solo da questo punto puoi tornare indietro per vedere come è arrivato il codice. Un esempio; Per capire come viene eseguito l'annullamento. Sai dove nel codice le cose sono annullate, ma non sai come le cose ci arrivano . Questo sarebbe un candidato per il backtracing per capire come funziona la funzione.
Traccia in avanti
La traccia in avanti sta individuando un punto iniziale per un evento associato a una funzione (vedi sotto). Una volta lì, i messaggi di registrazione vengono inseriti nel codice sorgente o vengono impostati i punti di interruzione. Questo processo si ripete man mano che avanzi più lontano da punto di partenza fino a quando non scopri l' obiettivo per la funzione.
Pro e contro
- È il punto di partenza più semplice per trovare una funzione.
- La complessità del codice riduce l'efficacia della traccia in avanti. Più condizioni ci sono nel codice maggiore è la possibilità che tu vada nella direzione sbagliata.
- La traccia in avanti spesso determina l'impostazione di punti di interruzione che verranno attivati da eventi non correlati. Interrompere il processo di debug e interferire con la ricerca.
Start Point Discovery
È possibile utilizzare parole chiave, identificatori dell'interfaccia utente (ID pulsante, nomi di finestre) o listener di eventi facili da trovare associati alla funzione. Ad esempio, potresti iniziare con il pulsante utilizzato per attivare un annullamento funzione di .
Processo Di Eliminazione
Puoi pensare a questo come al punto centrale rispetto alle posizioni del punto iniziale e finale . Esegui un processo di eliminazione quando sai già che viene utilizzato un pezzo di codice in una funzione, ma non è né l'inizio né la fine della funzione.
La direzione che prendi dal punto centrale dipende dal numero di voci ed uscite. Se il blocco di codice viene utilizzato in molti punti, la traccia indietro da questa posizione potrebbe richiedere molto tempo poiché devono essere ispezionati tutti. Quindi si utilizza un processo di eliminazione per ridurre questo elenco. In alternativa, è possibile eseguire una traccia in avanti da questo punto, ma anche in questo caso se il pezzo di codice si dirama in molti punti questo può anche essere un problema.
Devi ridurre le indicazioni di posizione non seguendo percorsi che chiaramente non verrebbero eseguiti per la funzione. Passando questo codice e posizionando i punti di interruzione solo dove è probabilmente correlato alla funzione.
Punto medio debug del richiede spesso funzionalità IDE più avanzate. La capacità di vedere la gerarchia del codice e le dipendenze. Senza quegli strumenti è difficile da fare.
Pro e contro
- I punti medi sono spesso la prima porzione di codice che ti viene in mente quando pensi alla funzione. Ti dici "Ah, questo deve usare XXXX per funzionare".
- I punti centrali possono rivelare i punti di partenza nel modo più semplice.
- I punti medi possono essere un modo semplice per recuperare il percorso verso una funzione quando vengono persi a causa di modifiche di sincronizzazione o threading.
- I punti di mezzo possono portarti a codice che non conosci. Ti costa tempo per imparare cosa sta succedendo.