Ghidra ha un debugger?
Sì. Ghidra dispone di un framework Debugger che può avviare o collegarsi a un target in esecuzione, registrare un trace, mostrare registri e memoria e seguire l'esecuzione con breakpoint e step. Il Debugger non sostituisce il Decompiler: il Decompiler interpreta un programma staticamente, mentre il Debugger consente di osservare uno stato di esecuzione alla volta.
Per la prima sessione, considera il flusso come tre viste collegate. GDB o un altro target agent supportato controlla il processo, Ghidra registra i cambiamenti come trace e il programma statico fornisce nomi, funzioni e contesto. Le conclusioni più utili nascono dal confronto tra tutte e tre le viste, non dall'affidarsi a un solo pannello.
Esegui il debug solo di programmi che possiedi, che hai il permesso di ispezionare o che sono esplicitamente autorizzati per la formazione. Conserva i file sconosciuti in una macchina virtuale isolata o in un laboratorio usa e getta e non eseguire campioni non attendibili su una workstation che contiene credenziali personali.
Prepara Ghidra, GDB e un laboratorio di pratica sicuro
La verifica attuale del sito ha trovato Ghidra 12.1.2 nel release ufficiale di NationalSecurityAgency/ghidra il 6 agosto 2026. Il release è stato pubblicato il 5 giugno 2026 e continua a usare il requisito JDK 21 a 64 bit riportato nella guida all'installazione. Su una macchina pulita, installa prima l'archivio ufficiale e verifica che Ghidra si avvii prima di cercare problemi nel Debugger.
Gli esempi del Debugger usano un target nativo e concetti GDB. I campi esatti del launcher variano in base al sistema operativo e al target agent, ma i punti decisionali restano gli stessi: selezionare l'architettura corretta, mantenere semplice il percorso del campione, registrare gli argomenti della riga di comando e distinguere tra avvio locale, attach a un processo esistente e connessione a un server GDB remoto.
- Usa un eseguibile piccolo con input e output prevedibili.
- Conserva il file originale, l'hash e il progetto Ghidra in cartelle separate.
- Se il target è sconosciuto, inizia dall'analisi statica; l'esecuzione dinamica è facoltativa.
- Consulta il corso ufficiale Ghidra Debugger quando ti serve un esempio specifico per il target agent.
| Necessità | Perché conta | Controllo rapido |
|---|---|---|
| Ghidra 12.1.2 | Interfaccia del Debugger e del trace | Apri Ghidra normalmente |
| JDK 21 a 64 bit | Esegue l'applicazione Java | Controlla java -version |
| GDB o target agent | Controlla il processo in esecuzione | Esegui gdb --version |
| Campione autorizzato | Mantiene l'esercitazione conforme | Usa un binario di laboratorio |
| Simboli, quando disponibili | Rendono le funzioni più leggibili | Conserva file di debug corrispondenti |
Avvia il primo target con Ghidra Debugger
Crea un Non-Shared Project e importa l'eseguibile di pratica, così Ghidra può costruire la vista statica del programma. Poi apri lo strumento Debugger dall'ambiente del progetto. Il primo obiettivo non è ricostruire un codice sorgente perfetto, ma dimostrare che il target si avvia, che l'architettura è corretta e che il trace riceve uno stato utile.
Scegli il launcher GDB locale e controlla ogni campo prima di premere Launch. Image è il file target, Arguments sono i valori esatti della riga di comando, gdb command seleziona l'eseguibile del debugger e Architecture ed Endian devono corrispondere al campione. Se non sei sicuro, verifica formato del file e processore invece di ripetere un avvio configurato male.
- 1
Crea il progetto
Apri la finestra del progetto, scegli File > New Project, seleziona Non-Shared Project e salvalo in una cartella di laboratorio usa e getta. Importa lo stesso file che vuoi avviare.
- 2
Apri Debugger
Avvia lo strumento Debugger e scegli l'azione launcher o target agent adatta al tuo ambiente. Tieni aperto il programma statico per confrontarlo con il trace.
- 3
Controlla i campi del launcher
Imposta percorso dell'immagine, argomenti, comando GDB, architettura, endianness ed eventuali valori inferior TTY o di ambiente. Nel primo percorso di laboratorio evita spazi e metacaratteri della shell.
- 4
Avvia e metti in pausa
Avvia il target, attendi il primo stop e conferma che thread, program counter, Listing e stato del Debug Console siano visibili prima dello step.

Collegati a un processo o a un target remoto
L'avvio pone il target sotto il controllo del debugger. L'attach parte da un processo già in esecuzione, mentre una connessione remota usa un target agent come un server GDB o un workflow remoto supportato. Queste modalità sono utili, ma aggiungono variabili di permessi, architettura, spazio degli indirizzi e rete. Fai funzionare prima un avvio locale prima di passare ad attach o debug remoto.
Per una sessione attach, identifica il processo tramite un workflow di laboratorio autorizzato, seleziona il connettore corretto e verifica l'architettura del processo. Per un target remoto, controlla host, porta, versione del debugger server, file di simboli e confine di fiducia. Una connessione può riuscire mentre il trace resta incompleto se il target agent non espone registri, memoria o mappature dei moduli.
Non esporre un debugger server a una rete non attendibile. Usa una rete privata di laboratorio, autenticazione o un tunnel sicuro quando opportuno e chiudi il listener al termine dell'esercitazione.
- 1
Scegli la modalità di connessione
Usa Launch per un nuovo processo locale, Attach per un processo locale già esistente o un workflow remoto per un server GDB o un altro agent supportato.
- 2
Abbina il target
Controlla processore, endianness, presupposti del sistema operativo e spazio degli indirizzi. Carica simboli corrispondenti se il target è stripped o ottimizzato.
- 3
Convalida il primo stop
Controlla thread, program counter, moduli e output della console. Se compare solo un banner di connessione, considera la sessione incompleta finché lo stato non viene popolato.
Impara a usare l'area di lavoro del Debugger senza perderti
L'area di lavoro del Debugger è densa perché mostra diverse versioni dello stesso stato di esecuzione. Parti dal program counter e dal thread selezionato, poi usa i pannelli vicini per rispondere a una domanda alla volta. Se il target è sconosciuto, non aprire tutte le viste insieme: un ciclo piccolo e ripetibile è più facile da diagnosticare.
La vista Registers è un'istantanea dello stato, non una spiegazione di alto livello. Un registro modificato mostra cosa ha osservato il target in uno stop. Per capire perché è cambiato, controlla l'istruzione nel Listing, lo stack o la memoria vicina e il rapporto chiamante/chiamato nel programma statico.
| Finestra | Cosa mostra | Prima azione utile |
|---|---|---|
| Debug Console | Messaggi e comandi del target agent | Controlla gli errori di launch o attach |
| Dynamic Listing | Istruzioni nello stato corrente del trace | Segui il program counter |
| Breakpoints | Stop attivi ed effettivi | Conferma lo stato del breakpoint |
| Registers | Valori e rappresentazioni dei registri | Confronta prima e dopo uno step |
| Threads / Stack | Percorsi di esecuzione e frame di chiamata | Seleziona il thread interessante |
| Memory | Byte e regioni mappate | Ispeziona un indirizzo referenziato |

Imposta breakpoint ed esegui il codice passo passo
Un breakpoint è utile solo quando si ferma in una posizione che sai spiegare. Parti dall'entry point, da una funzione nota o da un branch collegato all'input di pratica. Dopo lo stop, usa Resume per continuare, Interrupt per riprendere il controllo, Step Into per entrare in una chiamata, Step Over per mantenere il livello corrente e Step Out per tornare al chiamante. Le icone della toolbar possono cambiare: affidati al nome dell'azione e allo stato del thread.
Se un breakpoint è presente ma non diventa mai effettivo, controlla se il target ha raggiunto il modulo, se l'indirizzo è mappato, se i permessi consentono lo stop e se la mappatura statico-dinamica è corretta. Un breakpoint su una funzione ottimizzata o inline può richiedere un'istruzione vicina o una posizione basata sui simboli.
- Imposta prima un solo breakpoint; diversi breakpoint pending rendono più difficile leggere la prima sessione.
- Registra program counter, thread selezionato e registro rilevante prima dello step.
- Dopo ogni stop significativo, annota input, branch, valore di memoria e conclusione.
- Rimuovi o disabilita i breakpoint temporanei prima di consegnare il progetto a qualcun altro.
Mappa lo stato in esecuzione a CodeBrowser e Decompiler
Il Debugger è molto più utile quando il trace e il programma statico importato sono mappati. Usa indirizzo corrente, modulo, funzione e byte dell'istruzione per trovare lo stesso codice in CodeBrowser. Poi leggi il Decompiler come un'ipotesi: può mostrare il flusso di controllo e le variabili probabili, ma resta un'interpretazione da verificare con Listing e stato in esecuzione.
Qui il debugger si distingue anche da un terminale GDB autonomo. GDB può controllare l'esecuzione, mentre Ghidra mantiene il trace dinamico accanto a simboli, blocchi di memoria, riferimenti e contesto del decompiler. Se la mappatura è errata, controlla base del modulo, architettura, rilocazione e programma importato invece di forzare una corrispondenza fuorviante.
- 1
Trova l'indirizzo dinamico
Usa il program counter o la posizione di un breakpoint per identificare modulo e indirizzo correnti nel trace.
- 2
Trova la corrispondenza statica
Apri la posizione corrispondente in CodeBrowser e conferma byte, confini della funzione e mappatura del modulo.
- 3
Spiega il comportamento
Confronta Listing, Decompiler, registri, memoria e call stack. Registra ciò che è osservato separatamente da ciò che è dedotto.
Problemi comuni del Ghidra Debugger e prossimi passi
La maggior parte dei problemi della prima sessione deriva da configurazioni non corrispondenti, non dall'assenza di una funzione del Debugger. Cambia una cosa alla volta e conserva l'output della console. Per verificare la toolchain, un campione piccolo e pulito è più utile di un target complesso.
Non considerare una connessione riuscita come prova che la sessione sia pronta. Conferma un thread popolato, un program counter, la mappa dei moduli e almeno un pannello di stato leggibile. Se il target è stripped o ottimizzato, prevedi più lavoro su simboli e mappatura degli indirizzi.
| Sintomo | Causa probabile | Prossimo passo |
|---|---|---|
| Comando GDB non trovato | GDB non è installato o non è nel PATH | Usa un percorso assoluto e verifica gdb --version |
| Istruzioni inutilizzabili | Architettura o endianness errati | Ricontrolla il formato e reimporta |
| Il breakpoint resta pending | Modulo o indirizzo non sono mappati | Avanza, controlla Modules e imposta di nuovo lo stop |
| Registri vuoti | Il target si è fermato prima di catturare lo stato | Seleziona il thread fermo e aggiorna la vista del trace |
| I simboli non corrispondono | File stripped o file di debug errati | Carica simboli corrispondenti e verifica la base del modulo |
| Attach negato | Permessi del sistema operativo o isolamento | Usa un processo di laboratorio autorizzato e modifica la policy con attenzione |
Cosa imparare dopo la prima sessione di debug
Ripeti lo stesso ciclo di avvio e stop su due o tre programmi piccoli e autorizzati prima di provare un target remoto o un campione complesso multithread. Esercitati a spiegare un branch dall'input al breakpoint, al cambiamento di registro o memoria e infine alla funzione statica corrispondente. Questa traccia di prove vale più di molte schermate o di step eseguiti senza una domanda.
Usa il tutorial Ghidra per principianti per creare il progetto, eseguire Auto Analysis, seguire i riferimenti e leggere Function Graph. Consulta la guida al Decompiler quando il pseudocodice ha bisogno di nomi e tipi migliori e torna alla guida all'installazione se il problema reale riguarda JDK o launcher. Il corso ufficiale del Debugger resta la fonte migliore per i dettagli specifici del target agent.
Domande frequenti sul Ghidra Debugger
Ghidra ha un debugger?
Sì. Ghidra include un framework Debugger per avviare o collegarsi a un target, registrare trace, ispezionare lo stato, impostare breakpoint ed eseguire il programma passo passo. Completa, invece di sostituire, CodeBrowser e Decompiler statici.
Come collego Ghidra Debugger a un processo?
Avvia lo strumento Debugger, scegli un workflow di attach o un target agent supportato, seleziona il processo autorizzato e verifica architettura e stato iniziale. Prima dello step, assicurati che thread, program counter, moduli e registri siano popolati.
Serve GDB per usare Ghidra Debugger?
Il requisito esatto dipende dal target agent e dal workflow. Il percorso per principianti di questa guida usa GDB perché è un'interfaccia comune per target locali e remoti. Altri agent supportati possono avere prerequisiti e campi di configurazione diversi.
Il Ghidra Debugger è uguale al Decompiler?
No. Il Decompiler interpreta staticamente i byte del programma importato. Il Debugger osserva uno stato di esecuzione reale, come istruzione corrente, registri, memoria, thread e stack. Mappare il trace al programma statico permette di usare entrambi insieme.
Quale versione di Ghidra è stata verificata per questa guida?
L'endpoint ufficiale dell'ultima release, verificato il 6 agosto 2026, ha restituito Ghidra 12.1.2, pubblicato il 5 giugno 2026. In quella verifica il sito non ha trovato una release ufficiale più recente; controlla di nuovo la pagina ufficiale prima di affidarti a un comportamento specifico della versione.