Wie kann ich die GDB-Ausgabe während des interaktiven Debuggens hervorheben und einfärben?

172

Bitte antworten Sie nicht. Ich sollte ddd, nemiver, emacs, vim oder ein anderes Front-End verwenden. Ich bevorzuge gdb so wie es ist, möchte aber die Ausgabe mit einigen Terminalfarben sehen.

Elmarco
quelle
4
Es gibt Ihnen keine Farben (daher nenne ich dies keine Antwort), aber einige ~ / .gdbinit-Konfigurationen verbessern die Erfahrung. Ich benutze dies als absolutes Minimum: Set-Verlauf auf Set-Print speichern ziemlich gesetzt Output-Radix 16 Set-Höhe 0
activout.se
Es wäre schön, die akzeptierte Antwort zu ändern, damit meine alte, falsche Antwort gelöscht werden kann. Vielen Dank.
Ddaa
Sobald die aktuelle Zeile markiert ist , lwird sourceware.org/bugzilla/show_bug.cgi?id=21044 implementiert . Ich füge lsie einfach zu a hinzu hook-stopund gebe Dev Nirvana ein.
Ciro Santilli 2 冠状 病 六四 事件 2

Antworten:

183

.gdbinit

Sie können Ihre ~/.gdbinitFarben optimieren . Sie können Mammons verwenden, .gdbinitdie hier erhältlich sind:

https://github.com/gdbinit/gdbinit

Sie können es so oft anpassen, wie Sie möchten. Ich fand dies dank dieser SO-Antwort . Hier ist die Art der Ausgabe, die Sie erhalten können:

.gdbinit

Ein GitHub-Repository ist ebenfalls verfügbar: https://github.com/gdbinit/Gdbinit

Nebenbei bemerkt wurde die gleiche Idee auch auf lldb angewendet .

GDB-Dashboard

Nach dem gleichen Konzept bietet GDB Dashboard eine modulare visuelle Schnittstelle für GDB in Python.

GDB-Dashboard

(nichtiger) Walker

Ein anderes ähnliches Projekt verwendet die Python-Unterstützung von GDB, um mehr Erweiterbarkeit zu bieten. Es lohnt sich daher, dies zu überprüfen: https://github.com/dholm/voidwalker

@dholm bietet auch seine eigene .gdbinit, die von der vorherigen inspiriert ist.

(nichtiger) Walker

pwndbg

Einige Projekte bieten eine Reihe nützlicher Funktionen, einschließlich einer verbesserten Anzeige. Dies ist bei PEDA oder pwndbg der Fall . Letzteres gibt folgende Beschreibung:

Ein PEDA-Ersatz. Im Geist unseres guten Freundes windbg, pwndbgausgesprochen wird pwnd-bag.

  • Geschwindigkeit
  • Elastizität
  • Code bereinigen

Es bietet Befehle zur Unterstützung des Debuggens und der Exploit-Entwicklung, die denen von PEDA ähneln, sowie eine bessere Anzeige (obwohl dies nicht der Hauptfokus des Projekts ist). Die Software befindet sich noch in der Entwicklung und wurde noch nicht ordnungsgemäß veröffentlicht.

pwndbg

Voltron

In der Projektbeschreibung heißt es:

Voltron ist eine erweiterbare Debugger-Benutzeroberfläche für Hacker. Sie können Dienstprogrammansichten, die in anderen Terminals ausgeführt werden, an Ihren Debugger (LLDB oder GDB) anhängen und hilfreiche Informationen wie Demontage, Stapelinhalt, Registerwerte usw. anzeigen, während Sie dennoch dieselbe Debugger-CLI erhalten, die Sie gewohnt sind.

Sie können Ihre ändern, .gdbinitum sie automatisch zu integrieren. Das Display selbst befindet sich jedoch außerhalb von GDB (z. B. in einem tmux-Split).

Voltron

GEF

GEF ist eine weitere Option und wird wie folgt beschrieben:

Es soll hauptsächlich von Exploitern und Reverse Engineers verwendet werden, um GDB mithilfe der Python-API zusätzliche Funktionen bereitzustellen, die den Prozess der dynamischen Analyse und Exploit-Entwicklung unterstützen.

GEF

BenC
quelle
Vielen Dank für Ihre Antwort. Haben Sie eine Idee, wie Sie den Registerausgang ausschalten können? (Ich benutze GDB für C ++ - Code und brauche keine Assembler-Ebene sofort)
Vak
Ja. Verdammt "Kommentare müssen mindestens 15 Zeichen lang sein."
Vak
1
@ Vak hast du versucht set $SHOWCPUREGISTERS = 0? Grundsätzlich haben Sie mehrere Parameter, die Sie einstellen können , und Sie können den Code jederzeit an Ihre Bedürfnisse anpassen.
BenC
100

Es sind keine Farben, aber betrachten Sie die Text-GUI von GDB . Es macht einen großen Unterschied, wie nutzbar GDB ist.

Sie können es starten mit:

gdb -tui executable.out

Bildschirmfoto:

Geben Sie hier die Bildbeschreibung ein

Wie Sie sehen können, sind die Hauptmerkmale:

  • zeigt, auf welcher Linie der Quelle wir uns befinden und welche Linien wir umgeben
  • zeigt Haltepunkte
John Carter
quelle
5
Beeindruckend! Vielen Dank! Ich habe lange nach einer schönen grafischen Shell um gdb gesucht und xxgdb, kgdb und ddd ausprobiert, aber keine davon hat für mich sehr gut funktioniert, also habe ich mich an die einfache alte Befehlszeilenschnittstelle gehalten. Das ist aber absolut perfekt!
Thomas Padron-McCarthy
46
Strg-x Strg-a: Geben Sie diese Option ein, um zum und vom Text-GUI-Modus zu wechseln. Funktioniert auch ohne die Befehlszeilenoption.
Jturcotte
2
Das Drucken auf stdout aus dem Programm bricht die Schnittstelle für mich. Gibt es Problemumgehungen außer der Umleitung?
Ciro Santilli 法轮功 冠状 病 六四 事件 9
1
Ich habe das gleiche Problem mit stdout, das die Schnittstelle bricht. Strg-L oder was auch immer Ihre Redraw-Bindung ist, macht sie zumindest verwendbar. Für Personen mit aktiviertem vi-Bearbeitungsmodus funktioniert Strg-X Strg-A nicht, aber der Befehl 'layout src' versetzt Sie in den TUI-Modus, wobei die Quelle wie im Bild angezeigt wird.
Wilywampa
1
Öffnen Sie ein zweites Terminal und geben Sie den folgenden Befehl ein: $ tty Verwenden Sie das Ergebnis, um stdout von der GDB-Sitzung mit dem Befehl (gdb) set inferior-tty zu diesem Terminal zu leiten. Ex. Von meinem .gdbinit-Set inferior-tty / dev / tty2 wird Ihr stdout jetzt $ gdb -tui nicht durcheinander bringen.
Netskink
46

Ich weiß, dass Sie kein Frontend wollten. Aber wie wäre es mit cgdb, es ist sehr nah an gdb, es ist Textmodus, hat aber oben ein Quellfenster mit Syntaxhervorhebung im Code.

Johan
quelle
2
sudo apt-get install cgdb
cs01
2
Ein echter Zufall :)
Ignorant
Ich habe gerade versucht, es auszuführen: Es wird keine GDB-Historie angezeigt, und es gibt auch eine vermasselte Eingabeaufforderung, bei der zwischen dem Caret und der tatsächlichen Stelle, an der das Symbol eingegeben wird, ein Leerzeichen steht (dies liegt wahrscheinlich daran, dass ich eine farbige Eingabeaufforderung habe gdb ) . Überhaupt nicht beeindruckt.
Hi-Angel
19

Durch die Verwendung von Farben ist es möglich, das Erscheinungsbild von gdb erheblich zu verbessern. Dies erfolgt über eine der folgenden Methoden:

  1. Farbige Eingabeaufforderung über die "Eingabeaufforderung festlegen". ZB machen Sie die Eingabeaufforderung fett und rot:

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

    oder machen Sie der Eingabeaufforderung eine neue Form, fett und rot:

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

    Geben Sie hier die Bildbeschreibung ein

  2. Kolorierte Befehle über Hooks

  3. Hervorhebung der farbigen Syntax des Befehls "list".

Alle Beispiele finden Sie in den folgenden Blog-Beiträgen von Michael Kelleher:

"Beautify GDB", 12. Mai 2010 (via archive.org)

"Experimentelle Hervorhebung der GDB-Syntax", 15. Mai 2010 (via archive.org)

Mike
quelle
14
Die Links sind defekt.
John Carter
7
@Mike: Es wäre nützlich, den Inhalt dieser Links hier zu veröffentlichen, da die Site nicht mehr zugänglich ist und robots.txt verhindert hat, dass archive.org sie indiziert.
Lucian Adrian Grijincu
1
Sie können die relevanten Informationen hier erhalten: sourceware.org/gdb/current/onlinedocs/gdb/Prompt.html
musiphil
1
Die Links verweisen jetzt auf einen archive.org-Cache der Blog-Beiträge.
Alex Quinn
1
@ Mike, anscheinend bist du der Autor der Blog-Beiträge. Wenn ja, sollten Sie dies in der Antwort offenlegen.
David Z
13

Neu in der kommenden GDB 8.3!

https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;a=blob;f=gdb/NEWS

Das Terminal-Styling ist jetzt für die CLI und die TUI verfügbar. GNU Source Highlight kann zusätzlich zum Styling von Quellcode-Snippets verwendet werden. Weitere Informationen finden Sie in den Befehlen "Stil festlegen" weiter unten.

Screenshot von gdb 8.2.91.20190401-23.fc30

Elmarco
quelle
Beste Antwort aller Zeiten! Hier finden Sie ein Tutorial zur Installation von gdb 8.3 medium.com/@simonconnah/… . Beachten Sie, dass Ihr Computer mindestens 512 MB RAM benötigt. Andernfalls gccbeginnt der Compiler mit dem Papierkorb.
Benutzer
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 

Warnung: Buggy. Keine TUI-Unterstützung, 'User-Mode'-Hack.

Habe den Hauptteil hier gefunden und ein bisschen modifiziert. Benötigt Highlight, C ++ Filt. Wenn die Farben durcheinander geraten, geben Sie den Befehl erneut ein.

ftk
quelle
7

cgdb ist viel besser als gdb -tui

justin.yqyang
quelle
Einverstanden. Einfache Zeilen, die von meinem Programm gedruckt wurden, haben die Konsole von gdb-tui zerstört. Dies geschieht nicht unter cgdb. Danke für den Tipp!
Randall Cook
4

Ich wollte Folgendes hervorheben: Betonen Sie die Zeilen eines Stack-Trace, die zu meinen Quelldateien gehören (und nicht zu Bibliotheken).

Die Lösung bestand darin, gdb-python zu verwenden (unter MSYS; unter Linux ist gdbPython normalerweise bereits integriert?), Hook backtrace, use

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

Verarbeiten Sie dann stack_tracemit Pythons regulären Ausdrücken und drucken Sie sie aus. Fett und andere Farben werden durch eine Funktion wie diese erreicht:

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)
Evgeni Sergeev
quelle
Ein funktionierendes Beispiel, das den Haken verwendet - auch wenn er minimal ist - wäre wahrscheinlich willkommener.
Hi-Angel
4

Eine weitere gute Farbkombination ergibt sich aus dieser Konfiguration . Dies erleichtert das Überprüfen der Rückverfolgungen erheblich. Um es zu verwenden, speichern Sie diese Datei einfach unter ~/.gdbinitund führen Sie gdb normal aus

Andrea Araldo
quelle
Danke, genau das habe ich gesucht. Ich habe mir eine Multithread-Anwendung mit einem langen Aufrufstapel angesehen, und diese ist perfekt für diese Backtraces.
Johan Bjäreholt
-2

Sie können jede gewünschte Farbe erhalten;

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