22 KiB
Cpp-Python GDB Debug Helper - Manuale Utente
1. Introduzione
1.1 Cos'è Cpp-Python GDB Debug Helper?
Cpp-Python GDB Debug Helper è un'Interfaccia Utente Grafica (GUI) progettata per migliorare e semplificare il processo di debugging di applicazioni C/C++ utilizzando GNU Debugger (GDB). Mira a fornire un'esperienza più intuitiva rispetto all'interfaccia a riga di comando di GDB, specialmente per attività come l'ispezione di strutture dati complesse e l'automazione di scenari di debugging ripetitivi.
1.2 A chi è rivolto?
Questo strumento è principalmente destinato agli sviluppatori C/C++ che usano GDB per il debugging e che trarrebbero beneficio da:
- Un'interfaccia visuale per le operazioni comuni di GDB.
- Una più facile ispezione di tipi di dati C++ complessi (strutture, classi, contenitori STL).
- Automazione di sequenze di debugging attraverso profili configurabili.
- Output strutturato dei dump delle variabili in formato JSON o CSV.
1.3 Caratteristiche Principali
- Debugging Manuale Interattivo: Avvia GDB, imposta breakpoint, esegui il tuo programma target e ispeziona le variabili. I dati dumpati vengono salvati in un file temporaneo, con opzioni per salvarli permanentemente in JSON o CSV.
- Dumping Avanzato delle Variabili: Utilizza uno script Python personalizzato per GDB per dumpare lo stato delle variabili C/C++, incluse strutture dati complesse come classi, struct, puntatori, array e
std::string, in un formato JSON strutturato. Questo JSON viene salvato direttamente su file dallo script dumper di GDB. - Profili di Debug Automatizzati: Crea, gestisci ed esegui profili di debug. Ogni profilo può definire:
- Eseguibile target e parametri del programma.
- Molteplici "azioni" di debug, ognuna specificando un breakpoint, variabili da dumpare, formato di output finale (JSON/CSV), directory di output e pattern per i nomi dei file. I dati dumpati vengono salvati direttamente su file dal dumper GDB, con la creazione di un file JSON intermedio che viene poi potenzialmente convertito in CSV o rinominato in base alle impostazioni del profilo.
- Analisi dei Simboli: Analizza il tuo eseguibile compilato (usando l'Interfaccia Macchina di GDB) per estrarre informazioni su funzioni, variabili globali, tipi definiti dall'utente e file sorgente. Questi dati aiutano nella configurazione delle azioni di debug.
- Ispezione Live dello Scope: Durante la configurazione di un'azione, lo strumento può interrogare GDB in tempo reale per elencare le variabili (locali e argomenti) disponibili a un breakpoint specificato, consentendo una selezione precisa.
- Ambiente Configurabile: Imposta i percorsi per GDB, lo script dumper Python personalizzato, vari timeout per le operazioni GDB e opzioni di comportamento del dumper.
- Output Flessibile: Salva i dati dumpati in formati JSON o CSV con nomi di file personalizzabili utilizzando placeholder per una migliore organizzazione. JSON è sempre il formato di dump iniziale da GDB, che può poi essere automaticamente convertito in CSV se specificato in un profilo.
- Logging GUI: Visualizza i log dell'applicazione e l'output grezzo di GDB direttamente nell'interfaccia.
2. Requisiti di Sistema e Configurazione dell'Ambiente
2.1 Sistemi Operativi Supportati
- Windows: Piattaforma primaria di sviluppo e test grazie all'uso della libreria
pexpectper il controllo del processo GDB. - Linux/macOS: GDB stesso è multipiattaforma. La logica di interazione con GDB potrebbe richiedere un adattamento per
pexpectsu sistemi Unix-like per una piena compatibilità (questo adattamento non è attualmente parte del codice fornito).
2.2 Python
- Python 3.7 o successivo è raccomandato (testato con versioni fino a 3.13).
2.3 Librerie Python Richieste
Sarà necessario installare le seguenti librerie Python. Tipicamente si possono installare usando pip:
pip install pexpect appdirs
pexpect: Per controllare GDB come processo figlio su Windows.appdirs: Utilizzato per determinare directory di configurazione e dati utente indipendenti dalla piattaforma.- Tkinter: Solitamente inclusa nelle installazioni Python standard e utilizzata per la GUI. Non è tipicamente richiesta un'installazione separata.
2.4 Installazione di GDB
- È richiesta un'installazione funzionante di GNU Debugger (GDB).
- Assicurarsi che GDB sia:
- Aggiunto alla variabile d'ambiente
PATHdel sistema. - Oppure, fornire il percorso completo all'eseguibile di GDB nella finestra di configurazione dell'applicazione.
- Aggiunto alla variabile d'ambiente
- Versioni di GDB 8.x e successive sono generalmente raccomandate per un migliore supporto allo scripting Python.
2.5 Compilazione dell'Applicazione Target C/C++
- L'applicazione C/C++ deve essere compilata con i simboli di debug.
- Per GCC/G++ o Clang, si usa il flag
-g:g++ -g -o mioprogramma mioprogramma.cpp. - Evitare livelli di ottimizzazione elevati (es.,
-O2,-O3) se interferiscono con il debug. Considerare-Og(ottimizza per l'esperienza di debug).
2.6 Installazione dello Strumento (Cpp-Python GDB Debug Helper)
Attualmente, il software è progettato per essere eseguito dal suo codice sorgente:
- Assicurarsi che tutti i prerequisiti siano soddisfatti.
- Scaricare o clonare il codice sorgente.
- Navigare nella directory radice del progetto (es.,
cpp_python_debug). - Eseguire lo script principale usando Python:
python -m cpp_python_debug
3. Guida Rapida
3.1 Avvio dell'Applicazione
- Soddisfare i "Requisiti di Sistema e Configurazione dell'Ambiente".
- Navigare nella directory radice del codice sorgente.
- Eseguire:
python -m cpp_python_debug.
3.2 Configurazione Iniziale (Percorso GDB)
- Al primo avvio, o se GDB non viene trovato, andare su Options > Configure Application....
- Nella tab Paths & Directories, per "GDB Executable Path", cliccare Browse... e selezionare l'eseguibile di GDB.
- Cliccare Save. L'area "Critical Configuration Status" dovrebbe mostrare "GDB: ... (OK)".
(Fortemente Raccomandato) Configurare il Percorso dello Script Dumper:
- Lo script Python personalizzato (
gdb_dumper.py, nella sottodirectorycore) abilita il dumping JSON avanzato ed è essenziale affinché l'esecuzione automatizzata dei profili salvi i dati su file in modo efficace. - In Options > Configure Application... > Paths & Directories, per "GDB Python Dumper Script Path", cliccare Browse... e navigare a questo file
gdb_dumper.py. - Cliccare Save.
3.3 La Tua Prima Sessione di Debug Manuale
- Seleziona la Tab "Manual Debug".
- Target Executable: Clicca Browse... e seleziona il tuo eseguibile C/C++ compilato con simboli di debug.
- Program Parameters (Opzionale): Inserisci gli argomenti da riga di comando se necessari.
- Breakpoint Location: Inserisci un breakpoint (es.,
main,miofile.cpp:42). - Variable/Expression to Dump: Inserisci la variabile/espressione da ispezionare (es.,
miaVarLocale). - Start GDB: Clicca 1. Start GDB. "GDB Raw Output" mostra i messaggi di avvio. La Status Bar indica "GDB session active."
- Set Breakpoint: Clicca 2. Set Breakpoint. "GDB Raw Output" mostra la conferma.
- Run Program: Clicca 3. Run Program. Il programma si esegue fino al breakpoint. Il pulsante cambia in "3. Continue".
- Dump Variable:
- Azione: A un breakpoint, clicca 4. Dump Variable. GDB (tramite lo script dumper) valuta l'espressione, la serializza in JSON e la salva in un file
.gdbdump.jsontemporaneo in una directory dedicata ai dump manuali. La GUI riceve un messaggio di stato dal dumper. - Output:
- "GDB Raw Output": Mostra la comunicazione con lo script dumper e lo stato JSON che restituisce.
- "Parsed JSON/Status Output": Mostra lo stato JSON ricevuto dallo script dumper, che include informazioni come successo/fallimento, il percorso del file JSON temporaneo creato, ed eventuali messaggi di errore.
- Stato Pulsanti: I pulsanti "Save as JSON", "Save as CSV", e "Open Dumps Folder" diventano attivi se il file di dump temporaneo è stato creato con successo.
- Azione: A un breakpoint, clicca 4. Dump Variable. GDB (tramite lo script dumper) valuta l'espressione, la serializza in JSON e la salva in un file
- Continue/Stop: Usa 3. Continue o Stop GDB.
- Salvataggio Dati: Dopo un dump, clicca Save as JSON o Save as CSV. Questo legge il file
.gdbdump.jsontemporaneo, lo converte/salva nella posizione e formato finali scelti, e tipicamente elimina il file temporaneo dopo un'operazione "Save As..." riuscita. Clicca Open Dumps Folder per visualizzare la directory dove sono memorizzati i dump manuali temporanei.
Congratulazioni! Hai completato la tua prima sessione di debug manuale.
4. Panoramica dell'Interfaccia Utente (Finestra Principale)
(Uno screenshot della finestra principale con aree annotate sarebbe ideale qui)
4.1 Barra dei Menu
- Options: "Configure Application...", "Exit".
- Profiles: "Manage Profiles...".
4.2 Area Stato Configurazione Critica
Mostra lo stato dell'eseguibile GDB e dello Script Dumper. Include un pulsante "Configure...".
4.3 Pannello Modalità (Tab)
- Tab Manual Debug: (Vedi Sezione 6) Per il debugging interattivo.
- Tab Automated Profile Execution: (Vedi Sezione 9) Per eseguire sequenze di debug preconfigurate.
4.4 Area Output e Log (Tab)
- Tab GDB Raw Output: Output testuale grezzo dal processo GDB.
- Tab Parsed JSON/Status Output: Mostra JSON formattato (meno comune ora per i profili) o il payload di stato JSON ricevuto dallo script dumper GDB (per entrambe le modalità Manuale e Profilo).
- Tab Application Log: Messaggi di log dall'applicazione GUI stessa.
4.5 Barra di Stato
Brevi messaggi sullo stato corrente dell'applicazione o sull'ultima operazione.
5. Finestra di Configurazione (Options > Configure Application...)
(Uno screenshot della Finestra di Configurazione con le tab sarebbe utile qui)
Organizzata in tab:
5.1 Tab Paths & Directories
- GDB Executable Path: Percorso completo a GDB. Cruciale.
- GDB Python Dumper Script Path (Optional): Percorso completo a
gdb_dumper.py. Fortemente raccomandato per la piena funzionalità.
5.2 Tab Timeouts (seconds)
Configura i timeout per le operazioni GDB (tutti in secondi):
- GDB Start: (Default: 30s)
- GDB Command: (Default: 30s)
- Program Run/Continue: (Default: 120s)
- Dump Variable: (Default: 60s)
- Kill Program: (Default: 20s)
- GDB Quit: (Default: 10s)
5.3 Tab Dumper Options
Controlla il comportamento di gdb_dumper.py:
- Max Array Elements: (Default: 100)
- Max Recursion Depth: (Default: 10)
- Max String Length: (Default: 2048)
- Enable Diagnostic JSON Dump to File: (Default: False) Se spuntato, salva una copia JSON grezza aggiuntiva di ogni dump per il debug dello script dumper.
- Diagnostic JSON Output Directory: Cartella per questi dump diagnostici. (Default: una sottocartella
gdb_dumper_diag_dumpsnella home dell'utente).
5.4 Salvataggio e Annullamento
- Save Button: Valida, applica, salva tutte le impostazioni nel file di configurazione e chiude.
- Cancel Button / 'X' della Finestra: Scarta le modifiche e chiude.
6. Modalità Debug Manuale
(Uno screenshot della tab Manual Debug sarebbe utile)
6.1 Impostazione Eseguibile Target e Parametri Campi per "Target Executable" (con Browse...) e "Program Parameters".
6.2 Impostazione Posizione Breakpoint
Campo per il breakpoint (es., main, file.cpp:123).
6.3 Impostazione Variabile/Espressione da Dumpare Campo per la variabile o espressione GDB.
6.4 Pulsanti di Controllo Sessione
- 1. Start GDB
- 2. Set Breakpoint
- 3. Run Program / 3. Continue
- 4. Dump Variable: (Cambiamento chiave) Comanda a GDB di dumpare la variabile e salvarla in un file
.gdbdump.jsontemporaneo. La GUI riceve un messaggio di stato. - Stop GDB
6.5 Interpretazione GDB Raw Output Mostra la comunicazione con GDB, incluso lo stato JSON dal dumper.
6.6 Interpretazione Parsed JSON/Status Output Mostra il payload di stato JSON dallo script dumper:
status: "success" o "error".variable_dumped: La variabile target.filepath_written: Percorso al file.gdbdump.jsontemporaneo creato.message,details: Conferma o informazioni sull'errore.
6.7 Salvataggio Dati Dumpati (JSON/CSV) & Gestione Dump Dopo un dump riuscito (file temporaneo creato):
- Pulsanti Save as JSON/CSV: Abilitati. Aprono una finestra "Salva con nome". Leggono il file
.gdbdump.jsontemporaneo, quindi lo convertono/salvano nel file finale scelto. Il file temporaneo viene tipicamente eliminato dopo un'operazione "Salva con nome" riuscita. - Pulsante Open Dumps Folder: Apre la directory dove sono memorizzati i file JSON temporanei dei dump manuali (configurata tramite
manual_dumps_output_path, solitamente nell'area di configurazione dell'applicazione).
7. Gestore Profili (Profiles > Manage Profiles...)
(Screenshot del Gestore Profili raccomandato)
7.1 Panoramica Finestra Gestore Profili Riquadro sinistro per la lista dei profili e controlli (New, Duplicate, Delete). Riquadro destro per i dettagli del profilo selezionato, analisi dei simboli e lista delle azioni. Pulsanti in basso per "Save All Changes" e "Close".
7.2 Gestione Profili Seleziona, crea nuovi, duplica o elimina profili. "Save All Changes" persiste tutto.
7.3 Modifica Dettagli Profilo Modifica "Profile Name" (univoco), "Target Executable", e "Program Parameters".
7.4 Analisi dei Simboli Mostra lo stato dell'analisi dei simboli memorizzata rispetto al target corrente nel form (checksum, timestamp).
- Pulsante Analyse Target Symbols: Avvia una nuova analisi per l'eseguibile corrente, memorizzando i risultati nel profilo selezionato (in memoria; richiede "Save All Changes" per persistere).
- Pulsanti View...: Sfoglia liste di funzioni, globali, tipi e sorgenti analizzati.
7.5 Gestione Azioni di Debug Lista delle azioni per il profilo. Pulsanti "Add...", "Edit...", "Remove" aprono l'Editor Azioni (Sezione 8).
8. Finestra Editor Azioni (dal Gestore Profili)
(Screenshot dell'Editor Azioni raccomandato)
Definisce una singola azione di debug.
8.1 Posizione Breakpoint Campo e pulsanti di assistenza "Funcs..." / "Files..." (usano analisi simboli o query GDB live).
8.2 Variabili da Dumpare Area di testo scrollabile (una per riga). Pulsanti "Globals..." e "Scope Vars..." assistono la selezione (Scope Vars esegue un'ispezione GDB live).
8.3 Formato Output Combobox: "json" o "csv".
8.4 Directory di Output Directory per i file di output di questa azione. Una sottocartella specifica per l'esecuzione viene creata qui.
8.5 Pattern Nome File Pattern per i nomi dei file di output.
- Placeholder Disponibili:
{profile_name},{app_name},{breakpoint},{variable},{timestamp}. - L'estensione finale (
.jsono.csv) viene aggiunta dall'applicazione in base alla selezione "Output Format". Lo script dumper GDB creerà prima un file intermedio con estensione.gdbdump.json. - Pattern Esempio:
dump_{app_name}_{breakpoint}_{variable}_{timestamp} - Questo pattern definisce il nome base del file.
8.6 Opzione "Continue execution after dump" Checkbox per controllare il comportamento di GDB dopo l'azione.
8.7 Opzione "Dump variables every time breakpoint is hit"
- Spuntato (Default): Le variabili vengono dumpate ogni volta che questo breakpoint viene incontrato.
- Non Spuntato: Le variabili vengono dumpate solo la prima volta che questo breakpoint viene raggiunto durante un'esecuzione del profilo per questa specifica azione.
8.8 Salvataggio/Annullamento Azione "OK" salva l'azione nel profilo. "Cancel" scarta le modifiche.
9. Modalità Esecuzione Automatizzata Profili
(Screenshot della tab Esecuzione Automatizzata raccomandato)
9.1 Selezione di un Profilo Dropdown elenca i profili disponibili.
9.2 Esecuzione del Profilo
Pulsante "Run Profile" avvia l'esecuzione. La GUI si aggiorna. Un ProfileExecutor viene eseguito in un thread separato.
- GDB si avvia, il dumper viene caricato, i breakpoint vengono impostati.
- Al raggiungimento di un breakpoint:
- Il Dumper salva JSON grezzo in un file intermedio (es.,
...azione.gdbdump.json). - Se il formato finale è JSON, il file intermedio viene rinominato.
- Se il formato finale è CSV, il JSON intermedio viene letto, convertito in CSV, salvato, e il JSON intermedio viene solitamente eliminato.
- "Produced Files Log" viene aggiornato.
- Il Dumper salva JSON grezzo in un file intermedio (es.,
9.3 Monitoraggio Stato Esecuzione e Barra di Progresso Etichetta di stato e barra di progresso mostrano l'avanzamento.
9.4 Interruzione di un Profilo in Esecuzione Pulsante "Stop Profile" tenta di terminare gradualmente.
9.5 Interpretazione del "Produced Files Log"
Vista ad albero con: Time, Breakpoint Spec, Variable, File Produced (nome finale), Status, Details, e potenzialmente "Raw GDB Dump File" (percorso al .gdbdump.json se conservato a causa di un errore).
9.6 Apertura della Cartella di Output Pulsante "Open Profile Output Folder" apre la directory di output principale per l'ultima esecuzione del profilo completata.
10. Risoluzione Problemi / FAQ
D: GDB non trovato / Problemi con lo script Dumper / Nessun simbolo di debug / _gdb_tool_error nell'output JSON.
R: (Stessi consigli di prima, enfatizzando il controllo di gdb_dumper_debug.log per problemi del dumper).
D: Esecuzione del profilo fallisce, si blocca, o i breakpoint non vengono raggiunti. R: (Stessi consigli di prima, verificare percorsi, BP, parametri, timeout).
D: La GUI non risponde. R: (Stessi consigli di prima, controllare timeout, console/Application Log per errori).
D: Come posso ottenere maggiori informazioni di debug da gdb_dumper.py?
R:
- Controlla
gdb_dumper_debug.log. La sua posizione è loggata dagdb_dumper.pyall'avvio (vedi GDB Raw Output o il file di log stesso, solitamente in~o accanto agdb_dumper.py). - L'applicazione GUI principale (
__main__.py) elimina questo log all'avvio per un log di sessione pulito. - Per output ancora più verboso per lo sviluppo dello script dumper, puoi abilitare l'opzione "Enable Diagnostic JSON Dump to File" in Options > Configure Application... > Dumper Options. Questo salva una copia JSON grezza aggiuntiva di ogni dump GDB nella "Diagnostic JSON Output Directory".
11. Casi d'Uso / Esempi
(Contenuto sostanzialmente invariato, ma rinforzare che i file di output sono ora creati direttamente in base alle impostazioni del profilo)
11.1 Dumpare un std::vector
- ...Quando il profilo viene eseguito, file come
vector_dumps/NomeProfilo_timestamp/processVector_myVector_timestamp.json(o.csv) verranno creati.
11.2 Tracciare una variabile globale
- ...File di output per
globalCounterverranno generati per ogni posizione di breakpoint.
11.3 Snapshot di strutture dati complesse
- ...Una serie di file JSON come
app_state_snapshots/NomeProfilo_timestamp/longRunningTask.cpp_75_appState_timestamp.jsonverrà creata.
12. Avanzato: Lo Script gdb_dumper.py
12.1 Ruolo e Interazione con GDB
- ...
- Logica di Serializzazione:
- Usa
gdb.parse_and_eval()per ottenere la variabile. - Attraversa il
gdb.Value, applicando le "Dumper Options". - Costruisce una rappresentazione Python.
- Serializza in una stringa JSON.
- Se un
target_output_filepathè fornito dall'applicazione principale (standard per entrambe le modalità Manuale e Profilo), il dumper salva la stringa JSON completa direttamente in questo file specificato (tipicamente con estensione.gdbdump.json). Quindi stampa un piccolo payload di stato JSON (indicante successo/fallimento e il percorso scritto) sull'output standard di GDB, racchiuso tra delimitatori.
- Usa
- Elaborazione GUI:
- La GUI cattura l'output di GDB, estrae il payload di stato JSON tra i delimitatori e lo analizza. Questo payload informa la GUI sul successo del dump lato GDB e sulla posizione del file JSON grezzo creato dal dumper.
- In Modalità Manuale, questo file JSON grezzo viene quindi utilizzato se l'utente sceglie "Save as JSON" o "Save as CSV" (e viene eliminato dopo un salvataggio riuscito).
- In Modalità Profilo, se l'azione del profilo specificava il formato "csv", la GUI legge questo file JSON grezzo, lo converte in CSV, lo salva come output finale e tipicamente elimina il JSON grezzo. Se era specificato "json", il file JSON grezzo viene solitamente rinominato nel nome file finale.
- La GUI cattura l'output di GDB, estrae il payload di stato JSON tra i delimitatori e lo analizza. Questo payload informa la GUI sul successo del dump lato GDB e sulla posizione del file JSON grezzo creato dal dumper.
12.2 File di Log del Dumper (gdb_dumper_debug.log)
(Contenuto per lo più invariato, enfatizzando il suo ruolo per problemi interni al dumper).
13. Appendice (Opzionale)
13.1 Riepilogo Placeholder Nomi File
I seguenti placeholder possono essere usati nel campo "Filename Pattern" (nell'Editor Azioni) per costruire il nome base dei tuoi file di output. L'estensione appropriata (.json o .csv per il file finale, e .gdbdump.json per il dump intermedio di GDB) sarà gestita dall'applicazione.
{profile_name}: Il nome del profilo (sanificato).{app_name}: Nome base dell'eseguibile target.{breakpoint}: Stringa della posizione del breakpoint (sanificata).{variable}: Nome della variabile/espressione (sanificato).{timestamp}: Timestamp (ANNO MESE GIORNO_ORA MINUTO SECONDO_MILLISECONDO).
Pattern Esempio: dump_{app_name}_{breakpoint}_{variable}_{timestamp}
Output Finale Esempio (se JSON): dump_mioprogramma_main_miaVar_20231027_143005_123.json
File Dump Intermedio GDB Esempio: dump_mioprogramma_main_miaVar_20231027_143005_123.gdbdump.json