Come evidenziare e colorare l'output di gdb durante il debug interattivo?


172

Per favore non rispondere Dovrei usare ddd, nemiver, emacs, vim o qualsiasi altro front-end, preferisco semplicemente gdb così com'è, ma vorrei vederne l'output con alcuni colori terminali.


4
Non ti darà i colori (quindi non lo chiamerò una risposta), ma alcune configurazioni ~ / .gdbinit miglioreranno l'esperienza. Lo uso come minimo
indispensabile

Sarebbe bello cambiare la risposta accettata in modo che la mia vecchia, risposta errata possa essere cancellata. Grazie.
ddaa,

Una volta evidenziata la riga corrente su lviene implementato sourceware.org/bugzilla/show_bug.cgi?id=21044 , aggiungerò semplicemente la hook-stope inserisco Dev Nirvana.
Ciro Santilli 2 冠状 病 六四 事件 法轮功

Risposte:


183

.gdbinit

Puoi modificare i tuoi ~/.gdbinitcolori. Puoi usare mammon's .gdbinitche è disponibile qui:

https://github.com/gdbinit/gdbinit

Puoi modificarlo quanto vuoi. L'ho trovato grazie a questa risposta SO . Ecco il tipo di output che puoi ottenere:

.gdbinit

È inoltre disponibile un repository GitHub: https://github.com/gdbinit/Gdbinit

Da un lato, la stessa idea è stata applicata anche a lldb .

Dashboard GDB

Seguendo lo stesso concetto, GDB Dashboard fornisce un'interfaccia visiva modulare per GDB in Python.

Dashboard GDB

(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.

(Void) walker

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è pronunciato pwnd-bag.

  • Velocità
  • elasticità
  • 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.

pwndbg

Voltron

La descrizione del progetto afferma:

Voltron è un'interfaccia utente di debugger estensibile per gli hacker. Ti consente di collegare al debugger (LLDB o GDB) viste di utilità in esecuzione in altri terminali, visualizzando informazioni utili come disassemblaggio, contenuti dello stack, valori di registro, ecc., Fornendo allo stesso tempo la stessa CLI del debugger a cui sei abituato.

Puoi modificarlo .gdbinitper integrarlo automaticamente. Tuttavia, il display stesso è al di fuori di GDB (ad es. In una divisione tmux).

Voltron

GEF

GEF è un'altra opzione ed è descritta come:

Ha lo scopo di essere utilizzato principalmente da sfruttatori e reverse-engineer, per fornire funzionalità aggiuntive a GDB utilizzando l'API Python come supporto durante il processo di analisi dinamica e lo sviluppo degli exploit.

GEF


molte grazie per la tua risposta, hai idea di come disattivare l'uscita del registro? (sto usando gdb per il codice C ++ e non ho bisogno di alcun livello di assemblatore subito)
vak

sì. Dannazione "I commenti devono contenere almeno 15 caratteri."
Vak,

1
@vak hai provato set $SHOWCPUREGISTERS = 0? Fondamentalmente hai diversi parametri che puoi impostare e puoi sempre modificare il codice in base alle tue esigenze.
BenC,

100

Non sono i colori, ma considera la gui del testo di gdb . Fa una grande differenza su quanto sia utilizzabile gdb.

Puoi avviarlo con:

gdb -tui executable.out

Immagine dello schermo:

inserisci qui la descrizione dell'immagine

Come puoi vedere, le caratteristiche principali sono:

  • mostra su quale linea della fonte ci troviamo e sulle linee circostanti
  • mostra i punti di interruzione

5
Wow! Grazie! Ho cercato a lungo una bella shell grafica attorno a gdb e ho provato xxgdb, kgdb e ddd, ma nessuno di loro ha funzionato molto bene per me, quindi mi sono bloccato con la semplice vecchia interfaccia a riga di comando. Ma questo è assolutamente perfetto!
Thomas Padron-McCarthy,

46
Ctrl-x Ctrl-a: inserisci questo per passare alla e dalla modalità gui del testo, funziona anche senza l'opzione della riga di comando.
jturcotte,

2
La stampa su stdout dal programma interrompe l'interfaccia per me. Qualche soluzione alternativa oltre a reindirizzarlo?
Ciro Santilli 9 冠状 病 六四 事件 法轮功

1
Ottengo lo stesso problema con stdout che rompe l'interfaccia. Ctrl-L o qualunque sia il tuo ridisegno lo rende utilizzabile almeno. Per le persone con la modalità di modifica vi abilitata, Ctrl-X Ctrl-A non funziona, ma il comando 'layout src' ti metterà in modalità TUI con la fonte mostrata come l'immagine.
wilywampa,

1
Apri un secondo terminale e poi lancia il comando: $ tty Usa il risultato per dirigere stdout dalla sessione gdb a quel terminale usando il comando (gdb) set inferior-tty. ex. dal mio .gdbinit set inferior-tty / dev / tty2 ora il tuo stdout non rovinerà $ gdb -tui.
netskink,

46

So che non volevi un frontend. Ma che dire di cgdb è molto vicino a gdb, è textmode ma ha una finestra sorgente sopra con l'evidenziazione della sintassi sul codice.


2
sudo apt-get install cgdb
cs01

2
Una vera serendipità :)
Ignorante

Ho appena provato a eseguirlo: non vede alcuna cronologia di gdb e ha anche un prompt rovinato, dove c'è un po 'di spazio tra il punto di inserimento e il luogo effettivo in cui viene digitato il simbolo (questo è probabilmente perché ho un prompt colorato in gdb ) . Per niente impressionato.
Hi-Angel,

19

È possibile migliorare notevolmente l'aspetto di gdb attraverso l'uso dei colori. Questo viene fatto tramite uno dei seguenti metodi:

  1. Prompt colorato tramite il "set prompt". Ad esempio, rendere il prompt in grassetto e rosso:

    set prompt \033[1;31m(gdb) \033[m

    oppure trasforma il prompt in una nuova forma, in grassetto e rosso:

    set prompt \033[01;31m\n\n#####################################> \033[0m

    inserisci qui la descrizione dell'immagine

  2. Comandi colorati tramite ganci

  3. Evidenziazione della sintassi colorata del comando "list".

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 (via archive.org)


14
I collegamenti sono interrotti.
John Carter,

7
@Mike: sarebbe utile pubblicare qui i contenuti di quei collegamenti poiché il sito non è più accessibile e robots.txt ha impedito a index.org di indicizzarlo.
Lucian Adrian Grijincu,

1
È possibile ottenere le informazioni pertinenti qui: sourceware.org/gdb/current/onlinedocs/gdb/Prompt.html
musiphil

1
I collegamenti sono ora puntati su una cache archive.org dei post del blog.
Alex Quinn,

1
@ Mike, sembra che tu sia l'autore dei post del blog; in tal caso, è necessario rivelarlo nella risposta.
David Z,

13

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 CLI e TUI. L'evidenziazione della sorgente GNU può essere utilizzata anche per fornire uno stile per i frammenti di codice sorgente. Vedere i comandi "imposta stile", di seguito, per ulteriori informazioni.

screenshot di gdb 8.2.91.20190401-23.fc30


La migliore risposta MAI! Puoi trovare qui un tutorial su come installare gdb 8.3 medium.com/@simonconnah/… , nota che la tua macchina ha bisogno di almeno 512 MB di RAM, altrimenti il gcccompilatore inizierà il cestino.
utente

7
#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 

Avvertenza: Buggy. Nessun supporto TUI, hack 'modalità utente'.

Ho trovato la parte principale qui e l'ho modificata un po '. È necessario evidenziare, c ++ filt. Se i colori vengono incasinati, re il comando.


7

cgdb è molto meglio di gdb -tui


Concordato. Linee semplici stampate dal mio programma hanno eliminato la console di gdb -tui. Questo non succede in cgdb. Grazie per il consiglio!
Randall Cook,


4

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 gdbviene già fornito con Python integrato?), Hook backtrace, use

python stack_trace = gdb.execute('backtrace', False, True')

Quindi elabora stack_tracecon 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 esempio funzionante che utilizza l'hook, anche se minimo, sarebbe probabilmente più gradito.
Hi-Angel,

4

Un'altra buona combinazione di colori è data da questa configurazione . Rende molto più facile l'ispezione dei backtrace. Per usarlo, basta salvare quel file come ~/.gdbinited eseguire normalmente gdb


Grazie, questo era esattamente quello che stavo cercando. Stavo cercando un'applicazione multi-thread con un lungo stack di chiamate e questo è perfetto per quei backtrace.
Johan Bjäreholt,

-2

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.