Come evidenziare e colorare l'output di gdb durante il debug interattivo?
Domanda
Per favore, non rispondere Dovrei usare ddd, nemiver, emacs, vim o qualsiasi altro front-end, preferisco semplicemente gdb così com'è, ma vorrei vedere il suo output con alcuni colori terminali.
Soluzione
.gdbinit
Puoi modificare il tuo ~ / .gdbinit
per avere colori. Puoi usare il .gdbinit
di mammon che è disponibile qui:
https://github.com/gdbinit/gdbinit
Puoi modificarlo quanto vuoi. Ho trovato questo grazie a questa risposta SO . Ecco il tipo di output che puoi ottenere:
È disponibile anche un repository GitHub: https://github.com/gdbinit/Gdbinit
In una nota a margine, la stessa idea era stata anche applicata a lldb .
Dashboard GDB
Seguendo lo stesso concetto, GDB Dashboard fornisce un'interfaccia visiva modulare per GDB in Python .
(void) walker
Un altro progetto simile utilizza il supporto Python di GDB per fornire maggiore estensibilità, quindi vale la pena dare un'occhiata: https: // github .com / dholm / Voidwalker
@dholm fornisce anche il suo .gdbinit ispirato al precedente.
pwndbg
Alcuni progetti forniscono una serie di funzioni utili, tra cui una migliore visualizzazione. Questo è il caso di PEDA o pwndbg . Quest'ultimo fornisce la seguente descrizione:
Una sostituzione PEDA. Nello spirito del nostro buon amico
windbg
,pwndbg
è pronunciatopwnd-bag
.
- Velocità
- Resilienza
- Codice pulito
Fornisce comandi per supportare il debug e sfruttare lo sviluppo simile a quelli di PEDA e una migliore visualizzazione (sebbene questo non sia l'obiettivo principale del progetto). Il software è ancora in fase di sviluppo e non è stato ancora rilasciato correttamente.
Voltron
La descrizione del progetto afferma:
Voltron è un'interfaccia utente di debugger estensibile per gli hacker. Te lo permette associare al debugger (LLDB le viste di utilità in esecuzione in altri terminali) o GDB), mostrando informazioni utili come lo smontaggio, lo stack contenuti, valori di registro, ecc., pur continuando a fornirti lo stesso CLI debugger a cui sei abituato.
Puoi modificare il tuo .gdbinit
per integrarlo automaticamente. Tuttavia, il display stesso è al di fuori di GDB (ad es. In una divisione tmux).
GEF
GEF è un'altra opzione ed è descritta come:
È destinato principalmente ad essere utilizzato da sfruttatori e reverse-engineer fornire funzionalità aggiuntive a GDB utilizzando l'API Python per fornire assistenza durante il processo di analisi dinamica e sviluppo dello sfruttamento.
Altri suggerimenti
Non sono i colori, ma considera text gui di gdb. Fa una grande differenza su quanto sia utilizzabile gdb.
Puoi avviarlo con:
gdb -tui executable.out
Cattura schermo:
Come puoi vedere, le caratteristiche principali sono:
- mostra su quale linea della fonte ci troviamo e sulle linee circostanti
- mostra i punti di interruzione
So che non volevi un frontend. Ma che mi dici di cgdb è molto vicino a gdb, è textmode ma ha una finestra sorgente sopra con l'evidenziazione della sintassi sul codice.
È possibile migliorare notevolmente l'aspetto di gdb attraverso l'uso dei colori. Questo viene fatto tramite uno dei seguenti metodi:
-
Prompt colorato di "quot set prompt". Ad esempio, rendere il prompt in grassetto e rosso:
imposta prompt \ 033 [1; 31m (gdb) \ 033 [m
o trasforma il prompt in una nuova forma, in grassetto e rosso:
imposta prompt \ 033 [01; 31m \ n \ n ######################################## ##### > \ 033 [0m
-
Comandi colorati tramite hook
- Evidenziazione della sintassi colorata dell'elenco " " comando.
Tutti gli esempi sono disponibili nei seguenti post di blog scritti da Michael Kelleher:
" Beautify GDB " ;, 12 maggio 2010 (tramite archive.org)
" Evidenziazione della sintassi GDB sperimentale " ;, 15 maggio 2010 (tramite archive.org)
#into .gdbinit
shell mkfifo /tmp/colorPipe
define hook-disassemble
echo \n
shell cat /tmp/colorPipe | c++filt | highlight --syntax=asm -s darkness -Oxterm256 &
set logging redirect on
set logging on /tmp/colorPipe
end
define hookpost-disassemble
hookpost-list
end
define hook-list
echo \n
shell cat /tmp/colorPipe | c++filt | highlight --syntax=cpp -s darkness -Oxterm256 &
set logging redirect on
set logging on /tmp/colorPipe
end
define hookpost-list
set logging off
set logging redirect off
shell sleep 0.1s
end
define hook-quit
shell rm /tmp/colorPipe
end
define re
hookpost-disassemble
echo \033[0m
end
document re
Restore colorscheme
end
Avviso: Buggy. Nessun supporto TUI, hack "in modalità utente".
Trovato la parte principale qui e lo ha modificato un po '. È necessario evidenziare, c ++ filt. Se i colori si incasinano, re il comando.
cgdb
è molto meglio di gdb -tui
Bene, ho appena trovato questo trucco usando colout: https: / /github.com/nojhan/colout/blob/master/colout/example.gdbinit
Volevo evidenziare come segue: enfatizzare le linee di una traccia dello stack che appartengono ai miei file sorgente (piuttosto che alle librerie).
La soluzione era usare gdb-python (su MSYS; su Linux in genere gdb
viene fornito con Python già incorporato?), agganciare backtrace
, usare
python stack_trace = gdb.execute('backtrace', False, True')
Quindi elabora stack_trace
con le regex di Python e stampale. Il grassetto e altri colori sono raggiunti da una funzione come questa:
def term_style(*v):
"""1 is bold, 30--37 are the 8 colours, but specifying bold may also
change the colour. 40--47 are background colours."""
return '\x1B['+';'.join(map(str, v))+'m'
#Use like this:
print term_style(1) + 'This will be bold' + term_style(0) #Reset.
print term_style(1,30) + 'This will be bold and coloured' + term_style(0)
print term_style(1,30,40) + 'Plus coloured background' + term_style(0)
Un'altra buona combinazione di colori è data da questo configurazione. Rende molto più facile l'ispezione dei backtrace. Per usarlo, basta salvare quel file come ~ / .gdbinit
ed eseguire gdb normalmente
Novità nel prossimo GDB 8.3!
https: / /sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;a=blob;f=gdb/NEWS
Lo stile del terminale è ora disponibile per la CLI e la TUI. Fonte GNU L'evidenziazione può essere utilizzata anche per fornire uno stile al codice sorgente frammenti. Vedi lo "stile impostato" comandi, di seguito, per ulteriori informazioni.
puoi ottenere qualsiasi colore tu voglia;
# gdb
(gdb) shell echo -en '\E[47;34m'"\033[1m"
...
anything is now blue foreground and white background
...
(gdb) shell tput sgr0
... back to normal