Come individuare il codice sorgente che ha implementato una determinata funzione? [chiuso]

14

Mi chiedevo quali sono alcune tecniche per individuare quale codice implementasse una caratteristica specifica, su un'applicazione desktop.

Sono uno sviluppatore junior, con solo esperienza di programmazione professionale in giro per la programmazione web. Nel Web è più facile farlo. Ad esempio, si "ispeziona" un pulsante con gli strumenti del browser e si può vedere cosa viene fatto quando si fa clic su di esso. E poi, presumendo che tu abbia il codice sorgente completo, puoi eseguire il drill down della gerarchia delle chiamate.

Ma come si fa nelle applicazioni desktop? Almeno, senza dover immergersi completamente nella codebase?

    
posta py_script 08.03.2014 - 23:44
fonte

3 risposte

21

Traccia indietro

La traccia posteriore sta individuando un punto finale a un evento associato alla funzione (vedi sotto). Una volta lì, viene inserito un punto di interruzione nel debugger. La funzione viene attivata e quando il debugger si interrompe. Lo stack delle chiamate viene riesaminato per risalire al percorso di chiamata. Mentre saliti lo stack delle chiamate puoi prendere appunti sugli stati variabili o posizionare nuovi punti di interruzione per ispezionare di nuovo l'evento.

La funzione è nuovamente attiva e il debugger si arresta nei nuovi punti di interruzione. Puoi quindi ripetere backtracing o eseguire forward traceing fino a quando l'obiettivo viene trovato.

Pro e amp; Contro

  • È sempre più facile risalire allo stack delle 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 hai risparmiato un sacco di lavoro.
  • Se la funzione è interrotta. Potresti non raggiungere mai l'endpoint e il tempo può essere sprecato cercando di capire perché.

Individuazione degli endpoint

Per eseguire il debug di una funzione devi sapere dove si trova l'obiettivo finale nel codice sorgente. Solo da questo punto puoi backtrace per vedere come è arrivato il codice. Un esempio; Per capire come viene eseguito l'annullamento. Sai dove si trovano le cose nel codice, ma non sai come vanno le cose . Questo sarebbe un candidato per backtracing per capire come funziona la funzione.

Traccia in avanti

La traccia in avanti sta localizzando 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 viene ripetuto mentre ti allontani dal punto iniziale finché non trovi l'obiettivo per la funzione.

Pro e amp; 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, maggiori sono le possibilità che tu vada nella direzione sbagliata.
  • La traccia continua spesso ha come risultato l'impostazione dei punti di interruzione che verranno attivati da eventi non correlati. Interrompere il processo di debug e interferire con la tua ricerca.

Rilevamento punto iniziale

È possibile utilizzare parole chiave, identificativi dell'interfaccia utente (ID pulsante, nomi finestra) o semplici listener di eventi associati alla funzione. Ad esempio, potresti iniziare con il pulsante utilizzato per attivare una funzione annulla .

Processo di eliminazione

Puoi pensare a questo come punto centrale rispetto alle posizioni punto iniziale e punto finale . Esegui un processo di eliminazione quando sai già che un pezzo di codice è usato 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 e uscite. Se il chunk di codice viene utilizzato in molti posti, allora backtracing da questa posizione potrebbe essere molto dispendioso in termini di tempo in quanto devono essere tutti ispezionati. Quindi impieghi un processo di eliminazione per ridurre questa lista. In alternativa, puoi eseguire una traccia in avanti da questo punto, ma ancora una volta se il blocco del codice si dirama in più punti questo può anche essere un problema.

Devi ridurre le direzioni di posizione non seguendo percorsi che chiaramente non sarebbero stati eseguiti per la funzione. Superare questo codice e posizionare i punti di interruzione solo laddove è probabile che si riferiscano alla funzione.

Il debug

Punto centrale spesso richiede più funzionalità IDE avanzate. La possibilità di vedere la gerarchia del codice e le dipendenze. Senza questi strumenti è difficile da fare.

Pro e amp; Contro

  • I punti centrali sono spesso il primo pezzetto di codice che ti viene in mente quando pensi alla funzione. Dici a te stesso "Ah, questo deve usare XXXX per funzionare."
  • Punti centrali possono rivelare punti iniziali i più facili.
  • Punti centrali può essere un modo semplice per raccogliere la traccia di una funzionalità quando viene persa tramite la sincronizzazione o le modifiche di threading.
  • Punti centrali ti possono portare a codice che non conosci. Ti costa tempo per imparare cosa sta succedendo.
risposta data 09.03.2014 - 00:54
fonte
10

Supponendo che la funzione sia legata a qualche cosa dell'interfaccia utente, come un pulsante o un menu, ciò che tendo a fare segue (molto noioso ma funziona). Questo è che guarda attraverso il codice sorgente, non usando un debugger .

  1. Cerca il testo (eventualmente distintivo) sul pulsante, ad es. "Super Feature X3".
  2. Questo è probabilmente in un file con alcune costanti, ad es. %codice%. Per riferimento futuro, ricorda questo nome di file.
  3. Potrebbe esserci un altro livello (anche di due) di astrazione, continuare a cercare per ottenere la stringa "reale" che viene utilizzata dal pulsante. Nota come questo è fatto per il futuro.
  4. Ora cerca su quella costante. Spero che tu abbia trovato il pulsante. Forse è lì che collegano l'ActionListener. (Sto prendendo Java qui, YMMV, ma il concetto è ancora valido)
  5. Se necessario, cerca su quel pulsante e alla fine troverai dove si connette a un listener.
  6. Forse quell'ascoltatore in realtà reindirizza verso gli altri ascoltatori (la "vera" funzionalità) basata sulla costante, se così fosse, segui questa istruzione if / else o case. NOTA : Se c'è una cosa centrale dispatchy, questo è un ottimo posto per impostare i punti di interruzione .
  7. Infine, dovresti essere al codice effettivo.

Come nota @amon, a volte un Debugger è più semplice ...

    
risposta data 09.03.2014 - 00:16
fonte
3
  • Se riesci a trovare alcun codice correlato, puoi utilizzare il tuo software di controllo del codice sorgente per mostrare l'intero commit o i commit vicini che l'hanno aggiunto. Questo dovrebbe mostrarti tutto ciò che era necessario per implementare quella funzionalità.

  • Un modo semplice per trovare un punto di partenza da guardare sarebbe quello di passare attraverso il codice base cercando il testo sul pulsante.

  • Spesso, le persone inseriscono un ID di problema dal loro tracker dei problemi nei loro messaggi di commit. Se riesci a trovare un problema che descrive la richiesta di funzione, puoi cercare i commit con quell'ID di emissione.

risposta data 09.03.2014 - 01:46
fonte

Leggi altre domande sui tag