AVVIO & COMPILAZIONE

Per utilizzare GDB il programma va compilato con simboli di debug (-g). Opzionalmente disabilitare le ottimizzazioni (-O0) per un'esperienza di debug più prevedibile.

COMPILAZIONE
# Compilazione con debug symbols
gcc -g -O0 main.c -o prog

# Con DWARF-4 (massimo dettaglio)
gcc -g3 -gdwarf-4 -O0 main.c -o prog

# C++ con debug
g++ -g -O0 -std=c++17 main.cpp -o prog

# Multifile con Makefile: aggiungere -g a CFLAGS
CFLAGS = -g -O0 -Wall
AVVIO DI GDB
ComandoDescrizione
gdb progAvvia GDB con eseguibile prog
gdb -q progAvvio silenzioso (no banner)
gdb --args prog arg1 arg2Avvia con argomenti da passare al programma
gdb -p PIDAttach a un processo già in esecuzione
gdb prog coreAnalizza un core dump
gdb -tui progAvvia in modalità TUI (interfaccia testuale)
gdb -x script.gdb progEsegui comandi da file all'avvio
gdb -batch -x cmds.gdb progEsegui in batch mode (non interattivo)
COMANDI BASE DELLA SESSIONE
ComandoAbbreviazioneDescrizione
quitqEsci da GDB
help <cmd>hAiuto su un comando
apropos <keyword>Cerca comandi per keyword
shell <cmd>Esegui un comando shell senza uscire
!lsScorciatoia per shell ls
set pagination offDisabilita il paging dell'output
set confirm offNon chiedere conferma per quit/kill
GDB supporta il completamento con TAB e la storia comandi con le frecce. Premere ENTER su riga vuota ripete l'ultimo comando.
ESECUZIONE & ARGOMENTI (argc/argv)
RUN, CONTINUE, KILL
ComandoAbbreviazioneDescrizione
runrAvvia (o riavvia) il programma
run arg1 arg2r arg1 arg2Avvia con argomenti (argc/argv)
run < input.txtAvvia con stdin da file
run > out.txt 2>&1Redirect stdout/stderr
startAvvia e si ferma all'inizio di main()
startiAvvia e si ferma alla prima istruzione (entry point)
continuecRiprendi esecuzione fino al prossimo breakpoint
continue Nc NIgnora i prossimi N breakpoint, poi fermati
killkTermina il programma in debug
IMPOSTARE ARGOMENTI
(gdb) set args --verbose file.txt 42
(gdb) show args
Argument list to give program being debugged: "--verbose file.txt 42"

# Equivale a lanciare: ./prog --verbose file.txt 42
# argc = 4, argv[0]="./prog", argv[1]="--verbose", argv[2]="file.txt", argv[3]="42"

(gdb) run                        # usa gli args impostati
(gdb) run --other                # override: usa questi invece
VARIABILI D'AMBIENTE
(gdb) set environment LANG = it_IT.UTF-8
(gdb) unset environment LD_PRELOAD
(gdb) show environment PATH
ATTACH / DETACH
# Attach a processo esistente
(gdb) attach 12345
(gdb) detach                     # rilascia il processo

# Da riga di comando
gdb -p 12345
BREAKPOINTS

I breakpoints fermano l'esecuzione in un punto specifico. Ogni breakpoint ha un numero identificativo.

IMPOSTARE BREAKPOINTS
ComandoDescrizione
break mainBreak all'inizio di main()
break 42Break alla riga 42 del file corrente
break file.c:42Break alla riga 42 di file.c
break funcBreak all'inizio della funzione func
break file.c:funcBreak alla funzione func in file.c
break *0x4005a0Break a indirizzo esadecimale (utile per assembly)
break +5Break 5 righe dopo la posizione corrente
break -3Break 3 righe prima della posizione corrente
tbreak mainBreakpoint temporaneo (si cancella dopo il primo hit)
rbreak regexBreak su tutte le funzioni che matchano la regex
BREAKPOINTS CONDIZIONALI
# Break solo se la condizione è vera
(gdb) break 42 if i == 10
(gdb) break func if strcmp(name, "test") == 0
(gdb) break loop.c:50 if ptr != 0 && ptr->count > 100

# Aggiungere condizione a un breakpoint esistente
(gdb) condition 3 x > 0         # bp #3 si attiva solo se x > 0
(gdb) condition 3                  # rimuovi la condizione dal bp #3
GESTIONE BREAKPOINTS
ComandoDescrizione
info breakpointsLista tutti i breakpoints (alias i b)
delete 3Elimina breakpoint #3
deleteElimina tutti i breakpoints
disable 3Disabilita bp #3 (senza eliminarlo)
enable 3Riabilita bp #3
enable once 3Abilita bp #3 solo per un hit, poi disabilita
enable delete 3Abilita bp #3, lo elimina dopo il primo hit
ignore 3 10Ignora bp #3 per i prossimi 10 hit
clear funcRimuovi breakpoint alla funzione func
clear 42Rimuovi breakpoint alla riga 42
SAVE / RESTORE BREAKPOINTS
(gdb) save breakpoints bp.txt    # salva tutti i bp su file
(gdb) source bp.txt               # ricarica i bp da file
WATCHPOINTS

I watchpoints fermano l'esecuzione quando il valore di un'espressione cambia (o viene letto/scritto).

COMANDI WATCHPOINT
ComandoDescrizione
watch xFerma quando x viene modificata (write)
watch *0x601040Watch su indirizzo di memoria
watch arr[5]Watch su elemento specifico di un array
watch ptr->fieldWatch su campo di una struct via puntatore
watch -l ptr->fieldWatch sulla locazione di memoria (non sull'espressione)
rwatch xFerma quando x viene letta (read)
awatch xFerma su qualsiasi accesso (read o write)
watch x if x > 100Watchpoint condizionale
info watchpointsLista watchpoints attivi
I watchpoints hardware sono limitati dal processore (tipicamente 4 su x86). Se superati, GDB usa watchpoints software che sono molto più lenti.
STEPPING & NAVIGAZIONE
COMANDI DI STEPPING
ComandoAbbr.Descrizione
nextnStep over — esegui la prossima riga, senza entrare nelle funzioni
next Nn NEsegui N righe (step over)
stepsStep into — entra nella funzione chiamata
step Ns NEsegui N step into
finishfinStep out — esegui fino al return della funzione corrente
untiluEsegui fino a superare la riga corrente (utile nei loop)
until 60u 60Esegui fino alla riga 60
advance funcContinua fino a raggiungere func (come tbreak + continue)
jump 50j 50Salta alla riga 50 (attenzione: non esegue le righe saltate!)
jump *0x4005a0Salta a un indirizzo specifico
STEPPING A LIVELLO ASSEMBLY
ComandoAbbr.Descrizione
nextiniStep over una singola istruzione macchina
stepisiStep into una singola istruzione macchina
nexti 5ni 5Esegui 5 istruzioni macchina (step over)
jump è pericoloso: salta senza eseguire le righe intermedie. Le variabili locali potrebbero essere in stato inconsistente. Usare con cautela!
VARIABILI & ESPRESSIONI
PRINT (STAMPA VALORI)
ComandoDescrizione
print xStampa il valore della variabile x
print/x xStampa in esadecimale
print/d xStampa in decimale (con segno)
print/u xStampa in decimale (senza segno)
print/o xStampa in ottale
print/t xStampa in binario
print/c xStampa come carattere
print/f xStampa come float
print/a xStampa come indirizzo (con simbolo più vicino)
print/s ptrStampa come stringa C
ESPRESSIONI COMPLESSE
(gdb) print x + y * 2             # espressioni aritmetiche
(gdb) print (float)intvar          # cast esplicito
(gdb) print sizeof(struct node)    # sizeof
(gdb) print strlen(str)            # chiama funzioni del programma!
(gdb) print malloc(100)            # alloca memoria (chiamata reale)

# Variabili convenience (persistono nella sessione)
(gdb) set $i = 0
(gdb) print arr[$i++]             # usa e incrementa

# Valore di ritorno dell'ultima print
(gdb) print $                     # ultimo valore stampato
(gdb) print $$                    # penultimo valore stampato
(gdb) print $3                    # valore della print #3
MODIFICARE VARIABILI A RUNTIME
(gdb) set variable x = 42
(gdb) set variable *ptr = 99
(gdb) set variable str[0] = 'X'
(gdb) set {int}0x601040 = 123    # scrivi direttamente in memoria
VARIABILI LOCALI E SCOPE
(gdb) info locals                # tutte le variabili locali
(gdb) info args                  # argomenti della funzione corrente
(gdb) info variables             # tutte le variabili globali/statiche
(gdb) info variables ^my_       # variabili globali che matchano regex
(gdb) info scope func           # variabili visibili nel scope di func
ARRAY & PUNTATORI
STAMPARE ARRAY
(gdb) print arr                  # stampa intero array (se statico)
(gdb) print arr[3]               # singolo elemento
(gdb) print *arr@10              # primi 10 elementi (artificial array)
(gdb) print *(arr+5)@3           # 3 elementi a partire da arr[5]
(gdb) print (int[10])*arr        # cast a array di 10 int

# Array 2D (matrice)
(gdb) print matrix[2][3]         # singolo elemento
(gdb) print *matrix@rows         # tutte le righe

# Array di stringhe (char **)
(gdb) print argv[0]
(gdb) print *argv@argc           # tutti gli argomenti
PUNTATORI E STRUTTURE
(gdb) print ptr                  # stampa l'indirizzo
(gdb) print *ptr                 # dereferenzia: stampa il valore puntato
(gdb) print **ptr                # doppia dereferenziazione
(gdb) print ptr->name            # campo di struct via puntatore
(gdb) print *node                # stampa intera struct
(gdb) print node->next->data     # navigazione linked list

# Percorri linked list manualmente
(gdb) set $n = head
(gdb) while $n != 0
 > print *$n
 > set $n = $n->next
 > end
FORMATTAZIONE OUTPUT
# Controllo della visualizzazione struct
(gdb) set print pretty on       # formattazione indentata per struct
(gdb) set print pretty off
(gdb) set print array on        # un elemento per riga negli array
(gdb) set print elements 0      # nessun limite (default: 200)
(gdb) set print elements 50     # stampa max 50 elementi
(gdb) set print null-stop on    # ferma stampa array al primo 0
(gdb) set print union on        # mostra contenuto union nelle struct
(gdb) set print repeats 5       # comprimi sequenze ripetute (≥5 uguali)
DISPLAY AUTOMATICO

I display stampano automaticamente un'espressione ad ogni stop (breakpoint, step, ecc.).

COMANDI DISPLAY
ComandoDescrizione
display xMostra x ad ogni stop
display/x ptrMostra ptr in hex ad ogni stop
display/i $pcMostra prossima istruzione assembly ad ogni stop
display *arr@5Mostra primi 5 elementi ad ogni stop
info displayLista tutti i display attivi
undisplay 2Rimuovi display #2
undisplayRimuovi tutti i display
disable display 2Disabilita temporaneamente display #2
enable display 2Riabilita display #2
ESAME MEMORIA

Il comando x (examine) ispeziona direttamente la memoria. Sintassi: x/NFS addr dove N=count, F=format, S=size.

FORMATI (F)
LetteraFormatoLetteraFormato
xEsadecimaledDecimale con segno
uDecimale senza segnooOttale
tBinarioaIndirizzo
cCaratterefFloat
sStringa CiIstruzione assembly
DIMENSIONI (S)
LetteraDimensione
bByte (1 byte)
hHalfword (2 byte)
wWord (4 byte) — default
gGiant (8 byte)
ESEMPI
(gdb) x/10xw &arr              # 10 word in hex dall'indirizzo di arr
(gdb) x/20xb buf               # 20 byte in hex
(gdb) x/s str                   # stringa C
(gdb) x/5s argv                 # 5 stringhe consecutive
(gdb) x/10i $pc                # 10 istruzioni dal program counter
(gdb) x/10i main               # 10 istruzioni dall'inizio di main
(gdb) x/4gx $rsp               # 4 quadword dallo stack pointer
(gdb) x/16xb $rsp              # 16 byte dallo stack in hex
(gdb) x/xw 0x601040             # esame di indirizzo assoluto
INFO MEMORIA
(gdb) info proc mappings        # mappa memoria del processo
(gdb) info files                # sezioni dell'eseguibile
(gdb) info sharedlibrary        # librerie condivise caricate
(gdb) info address symbol       # indirizzo di un simbolo
(gdb) info symbol 0x4005a0     # simbolo all'indirizzo dato
TIPI & STRUTTURE
ISPEZIONE TIPI
(gdb) ptype x                   # tipo di una variabile
(gdb) ptype struct node          # definizione completa della struct
(gdb) ptype enum color           # valori di un enum
(gdb) whatis x                  # tipo senza espandere (typedef preservato)
(gdb) info types                # tutti i tipi definiti
(gdb) info types ^node         # tipi che matchano regex
FUNZIONI
(gdb) info functions            # tutte le funzioni
(gdb) info functions ^parse    # funzioni che matchano regex
STACK FRAMES
NAVIGAZIONE STACK
ComandoAbbr.Descrizione
backtracebtMostra lo stack trace completo
backtrace fullbt fullStack trace con variabili locali di ogni frame
backtrace 5bt 5Solo i primi 5 frame
backtrace -5bt -5Solo gli ultimi 5 frame
frame Nf NSeleziona il frame #N
upVai al frame chiamante (su nello stack)
up NSali di N frame
downVai al frame chiamato (giù nello stack)
down NScendi di N frame
info frameInformazioni dettagliate sul frame corrente
info registersi rValori di tutti i registri
info registers rax rbxValori di registri specifici
info all-registersTutti i registri (inclusi SSE, FPU, ecc.)
ESEMPIO STACK TRACE
(gdb) bt
#0  segfault_func (ptr=0x0) at main.c:12
#1  0x00005555555551a0 in process (data=0x7fffffffde20) at main.c:25
#2  0x0000555555555210 in main (argc=2, argv=0x7fffffffdf48) at main.c:40

(gdb) frame 2                    # vai al frame di main
(gdb) info locals                # variabili locali di main
(gdb) info args                  # argc e argv di main
SORGENTE & ASSEMBLY
VISUALIZZARE IL SORGENTE
ComandoAbbr.Descrizione
listlMostra 10 righe intorno alla posizione corrente
list 30l 30Mostra intorno alla riga 30
list 10,30Mostra dalla riga 10 alla 30
list funcl funcMostra il sorgente della funzione
list file.c:42Mostra intorno alla riga 42 di file.c
list -Mostra le 10 righe precedenti
set listsize 20Cambia il numero di righe mostrate
DIRECTORY SORGENTI
(gdb) directory /path/to/src     # aggiungi directory di sorgenti
(gdb) show directories           # mostra percorsi di ricerca sorgenti
DISASSEMBLY
ComandoDescrizione
disassembleDisassembla la funzione corrente
disassemble mainDisassembla main
disassemble /m mainDisassembla con sorgente C interleaved
disassemble /s mainDisassembla con sorgente (migliore di /m)
disassemble /r mainDisassembla con raw bytes
disassemble 0x4005a0,0x4005f0Disassembla range di indirizzi
disassemble $pc,+5050 byte dal program counter
SINTASSI ASSEMBLY
# Scegliere tra sintassi AT&T e Intel
(gdb) set disassembly-flavor att     # default su Linux
(gdb) set disassembly-flavor intel   # più leggibile per molti
(gdb) show disassembly-flavor
REGISTRI E ISTRUZIONI
(gdb) info registers            # registri general-purpose
(gdb) print/x $rip              # program counter
(gdb) print/x $rsp              # stack pointer
(gdb) print/x $rbp              # base pointer
(gdb) print/x $eflags           # flags register
(gdb) display/i $pc             # mostra istruzione corrente ad ogni stop
(gdb) x/10i $pc                # prossime 10 istruzioni
MULTIPROCESSO (fork)

GDB può seguire il processo padre o figlio dopo una fork(), o gestire entrambi contemporaneamente.

FOLLOW FORK
ComandoDescrizione
set follow-fork-mode parentSegui il padre dopo fork (default)
set follow-fork-mode childSegui il figlio dopo fork
show follow-fork-modeMostra la modalità corrente
DETACH ON FORK
ComandoDescrizione
set detach-on-fork onIl processo non seguito viene rilasciato (default)
set detach-on-fork offEntrambi i processi restano sotto GDB
GESTIONE PROCESSI MULTIPLI (INFERIORS)
# Ogni processo è un "inferior" in GDB
(gdb) info inferiors            # lista tutti i processi
(gdb) inferior 2                # passa al processo #2
(gdb) detach inferior 2         # rilascia il processo #2
(gdb) kill inferiors 2          # uccidi il processo #2

# Scheduling dei processi
(gdb) set schedule-multiple on  # tutti i processi eseguono quando fai continue
(gdb) set schedule-multiple off # solo il processo corrente esegue (default)
ESEMPIO COMPLETO FORK DEBUG
(gdb) set detach-on-fork off    # tieni entrambi
(gdb) set follow-fork-mode child
(gdb) break child_work          # bp nella funzione del figlio
(gdb) run
   ...fork() chiamata...
   [New inferior 2 (process 12346)]
   [Switching to inferior 2]
(gdb) info inferiors
  Num  Description       Executable
* 2    process 12346     /path/prog
  1    process 12345     /path/prog
(gdb) inferior 1                # torna al padre
MULTITHREAD (pthread)

GDB gestisce nativamente i programmi multi-thread. Compilare con -pthread e -g.

COMPILAZIONE
gcc -g -O0 -pthread main.c -o prog
GESTIONE THREAD
ComandoDescrizione
info threadsLista tutti i thread (il corrente ha *)
thread NPassa al thread #N
thread apply all btBacktrace di tutti i thread
thread apply all info localsVariabili locali di tutti i thread
thread apply 1 3 btBacktrace dei thread 1 e 3
thread name worker-1Assegna un nome al thread corrente
BREAKPOINTS PER THREAD
# Breakpoint che si attiva solo per un thread specifico
(gdb) break worker_func thread 3
(gdb) break 42 thread 2 if count > 10
SCHEDULER LOCKING
# Controlla se gli altri thread eseguono durante lo stepping
(gdb) set scheduler-locking off  # tutti i thread eseguono (default)
(gdb) set scheduler-locking on   # solo il thread corrente esegue
(gdb) set scheduler-locking step # lock durante step, free durante continue
(gdb) show scheduler-locking
NON-STOP MODE
# In non-stop mode, solo il thread che hita il bp si ferma
# Gli altri thread continuano a eseguire
(gdb) set non-stop on           # abilitare PRIMA di run
(gdb) set target-async on       # richiesto per non-stop

# In non-stop mode:
(gdb) interrupt                  # ferma il thread corrente
(gdb) interrupt -a               # ferma tutti i thread
(gdb) continue -a                # riprendi tutti i thread
Tip: per debug di deadlock, usa thread apply all bt per vedere dove ogni thread è bloccato (tipicamente in pthread_mutex_lock).
SEGNALI

GDB intercetta i segnali e permette di controllare come vengono gestiti.

GESTIONE SEGNALI
ComandoDescrizione
info signalsLista segnali e come GDB li gestisce
info signals SIGSEGVInfo su un segnale specifico
handle SIGPIPE nostop noprint passNon fermare, non stampare, passa al programma
handle SIGSEGV stop print nopassFermati, stampa, non passare al programma
handle SIGUSR1 stopFermati su SIGUSR1
signal SIGCONTInvia segnale al programma e riprendi
signal 0Riprendi senza inviare il segnale pendente
OPZIONI HANDLE
OpzioneDescrizione
stop / nostopFermati / non fermarti quando il segnale arriva
print / noprintStampa / non stampare un messaggio
pass / nopassPassa / non passare il segnale al programma
CATCHPOINTS

I catchpoints intercettano eventi specifici del sistema (syscall, eccezioni, ecc.).

COMANDI CATCH
ComandoDescrizione
catch syscallFerma ad ogni syscall
catch syscall writeFerma solo alla syscall write
catch syscall open closeFerma a open o close
catch forkFerma quando il programma chiama fork()
catch vforkFerma su vfork()
catch execFerma su exec()
catch throwFerma quando viene lanciata un'eccezione C++
catch catchFerma quando un'eccezione C++ viene catturata
catch load libnameFerma al caricamento di una libreria condivisa
catch signal SIGSEGVFerma quando il programma riceve un segnale
tcatch throwCatchpoint temporaneo (una sola volta)
REVERSE DEBUGGING

GDB supporta il debug "all'indietro": registra l'esecuzione e poi naviga avanti e indietro nel tempo.

REGISTRAZIONE
(gdb) target record-full        # inizia a registrare (dopo start/run)
(gdb) record                     # alias di target record-full
(gdb) record stop                # ferma la registrazione
(gdb) info record                # stato della registrazione
NAVIGAZIONE INVERSA
ComandoAbbr.Descrizione
reverse-continuercEsegui all'indietro fino al breakpoint precedente
reverse-steprsStep into al contrario
reverse-nextrnStep over al contrario
reverse-finishTorna all'inizio della funzione corrente
reverse-stepirsiStep indietro di una istruzione macchina
reverse-nextirniNexti al contrario
set exec-direction reverseTutti i comandi di stepping vanno all'indietro
set exec-direction forwardTorna alla direzione normale
Attenzione: il reverse debugging con record-full è molto lento. Per performance migliori, considera record btrace (richiede supporto hardware Intel PT) o strumenti come rr (rr record ./prog poi rr replay).
REMOTE DEBUGGING

GDB può eseguire il debug di programmi su macchine remote tramite gdbserver.

SETUP
# Sul target remoto (la macchina dove gira il programma)
gdbserver :1234 ./prog arg1 arg2
gdbserver --attach :1234 12345   # attach a PID esistente

# Sul host (la macchina di sviluppo)
(gdb) target remote 192.168.1.100:1234
(gdb) target remote :1234       # se locale (stessa macchina)

# Extended remote (permette di riavviare il programma)
gdbserver --multi :1234
(gdb) target extended-remote :1234
(gdb) set remote exec-file /path/to/prog
(gdb) run
COMANDI UTILI
(gdb) monitor help              # comandi del server remoto
(gdb) disconnect                # disconnetti dal target
(gdb) set sysroot /path/to/libs  # librerie del target
COMANDI AUTOMATICI SUI BREAKPOINTS

Si possono associare comandi ad un breakpoint: vengono eseguiti automaticamente ogni volta che il bp scatta.

COMMANDS
# Esegui comandi quando bp #1 scatta
(gdb) commands 1
 > silent                     # non stampare il messaggio di stop
 > printf "i=%d, x=%f\n", i, x
 > continue                   # riprendi automaticamente
 > end

# Logging personalizzato (printf-style debugging senza modificare il codice)
(gdb) break process_data
(gdb) commands
 > silent
 > printf "[LOG] process_data called: n=%d, ptr=%p\n", n, ptr
 > backtrace 3
 > continue
 > end

# Dprintf: breakpoint con printf integrato (non si ferma)
(gdb) dprintf main.c:42, "x=%d y=%d\n", x, y
LOGGING SU FILE
(gdb) set logging file gdb.log
(gdb) set logging on             # inizia a registrare l'output
... esegui comandi ...
(gdb) set logging off            # ferma la registrazione

# Redirect output solo al file (non al terminale)
(gdb) set logging redirect on
SCRIPTING & INIT FILES
FILE DI INIZIALIZZAZIONE
FileDescrizione
~/.gdbinitEseguito all'avvio di ogni sessione GDB
./.gdbinitEseguito se presente nella directory corrente
gdb -x file.gdbEsegui comandi dal file specificato
ESEMPIO ~/.gdbinit
# ~/.gdbinit
set disassembly-flavor intel
set print pretty on
set print array on
set pagination off
set confirm off
set history save on
set history size 10000
set history filename ~/.gdb_history

# Abilita .gdbinit locali (necessario dalla versione 8+)
set auto-load safe-path /

# Alias personalizzati
alias -a bta = thread apply all backtrace
DEFINE (COMANDI PERSONALIZZATI)
# Definisci un comando personalizzato
(gdb) define print_list
 > set $node = $arg0
 > set $i = 0
 > while $node != 0
  > printf "[%d] data=%d addr=%p\n", $i, $node->data, $node
  > set $node = $node->next
  > set $i = $i + 1
  > end
 > printf "Total: %d nodes\n", $i
 > end

(gdb) print_list head          # usa il comando personalizzato
PYTHON SCRIPTING
# GDB ha un interprete Python integrato
(gdb) python print(gdb.breakpoints())
(gdb) python print(gdb.parse_and_eval("x"))

# Script Python più complesso
(gdb) python
 > import gdb
 > for t in gdb.selected_inferior().threads():
 >     print(f"Thread {t.num}: {t.name or 'unnamed'}")
 > end

# Pretty printer personalizzato (in .gdbinit o file Python)
python
class VectorPrinter:
    def __init__(self, val):
        self.val = val
    def to_string(self):
        x = self.val['x']
        y = self.val['y']
        return f'Vec2({x}, {y})'

def vec_lookup(val):
    if str(val.type) == 'struct vec2':
        return VectorPrinter(val)
    return None

gdb.pretty_printers.append(vec_lookup)
end
TUI MODE (Text User Interface)

La TUI mostra il sorgente, l'assembly, i registri e il comando in pannelli separati all'interno del terminale.

ATTIVAZIONE
Comando / TastoDescrizione
gdb -tui progAvvia GDB direttamente in TUI
tui enableAttiva TUI in una sessione già avviata
tui disableDisattiva TUI
Ctrl+X, AToggle TUI on/off
Ctrl+X, 1Layout a singolo pannello
Ctrl+X, 2Layout a doppio pannello
Ctrl+X, OCambia pannello attivo
Ctrl+LRidisegna lo schermo
LAYOUT
ComandoDescrizione
layout srcSolo sorgente + comandi
layout asmSolo assembly + comandi
layout splitSorgente + assembly + comandi
layout regsAggiunge il pannello registri
layout nextPassa al prossimo layout
layout prevTorna al layout precedente
focus srcFocus sul pannello sorgente
focus asmFocus sul pannello assembly
focus cmdFocus sul pannello comandi
focus regsFocus sul pannello registri
winheight src +5Aumenta altezza del pannello sorgente
winheight src -5Riduci altezza
REGISTRI NELLA TUI
(gdb) tui reg general           # mostra registri general-purpose
(gdb) tui reg float             # mostra registri floating-point
(gdb) tui reg sse               # mostra registri SSE
(gdb) tui reg all               # mostra tutti i registri
Tip: se la TUI si "rompe" graficamente (output sovrapposti), premi Ctrl+L per ridisegnare. Se persiste, usa tui disable e poi tui enable.
CORE DUMP

Analizzare core dump per capire crash post-mortem.

GENERARE CORE DUMP
# Abilita core dump nel sistema
ulimit -c unlimited

# Verifica dove vengono salvati
cat /proc/sys/kernel/core_pattern

# Genera un core dump da GDB
(gdb) generate-core-file        # salva core.PID
(gdb) generate-core-file my.core
ANALISI CORE DUMP
# Apri il core dump
gdb ./prog core

# Comandi utili per l'analisi
(gdb) bt                         # dove è crashato?
(gdb) bt full                    # con variabili locali
(gdb) info registers            # stato registri al crash
(gdb) info locals                # variabili locali
(gdb) frame 0                    # vai al frame del crash
(gdb) list                       # sorgente del punto di crash
(gdb) print *ptr                 # ispeziona il puntatore che ha causato SIGSEGV
TIPS & TRICKS
CONVENIENCE VARIABLES
(gdb) print $_                   # ultimo indirizzo esaminato con x
(gdb) print $__                  # ultimo valore esaminato con x
(gdb) print $_exitcode           # exit code dell'ultimo run
(gdb) print $_siginfo            # info sull'ultimo segnale ricevuto
(gdb) print $_thread             # numero del thread corrente
CHIAMARE FUNZIONI
# Chiama funzioni del programma o della libc
(gdb) call printf("debug: x=%d\n", x)
(gdb) call free(ptr)
(gdb) call (void)close(fd)        # cast per ignorare il return value
CHECKPOINT & RESTART
# Salva lo stato del processo (come una snapshot)
(gdb) checkpoint                # crea un checkpoint (fork del processo)
(gdb) info checkpoints
(gdb) restart 1                 # torna al checkpoint #1
(gdb) delete checkpoint 1
SEARCH & FIND IN MEMORIA
# Cerca un pattern in memoria
(gdb) find /b 0x601000, 0x602000, 0x41, 0x42, 0x43   # cerca "ABC"
(gdb) find &buf, +sizeof(buf), "ERROR"                # cerca stringa
(gdb) find /w 0x601000, +0x1000, 0xDEADBEEF          # cerca word
VALGRIND + GDB
# Avvia Valgrind con GDB server integrato
valgrind --vgdb=yes --vgdb-error=0 ./prog

# In un altro terminale
gdb ./prog
(gdb) target remote | vgdb
MACRO DI PREPROCESSORE
# Per debuggare macro, compilare con:
gcc -g3 -gdwarf-4 -O0 main.c -o prog

(gdb) info macro MAX_SIZE       # definizione di una macro
(gdb) macro expand MAX(a,b)     # espansione di una macro
(gdb) info macros 42            # tutte le macro visibili alla riga 42
SCORCIATOIE E ALIAS
AbbreviazioneComando completo
rrun
ccontinue
sstep
nnext
finfinish
uuntil
bbreak
ddelete
pprint
btbacktrace
fframe
llist
qquit
i binfo breakpoints
i rinfo registers
i loinfo locals
i thinfo threads