Comment mettre en évidence et colorer la sortie gdb pendant le débogage interactif?

172

S'il vous plaît ne répondez pas Je devrais utiliser ddd, nemiver, emacs, vim ou tout autre front-end, je préfère juste gdb tel quel, mais j'aimerais voir sa sortie avec des couleurs de terminal.

Elmarco
la source
4
Cela ne vous donnera pas de couleurs (donc je n'appellerai pas cela une réponse), mais une configuration ~ / .gdbinit améliorera l'expérience. J'utilise ceci comme un strict minimum: définir l'historique enregistrer sur le plateau imprimer joli ensemble output-radix 16 définir la hauteur 0
activout.se
Ce serait bien de changer la réponse acceptée afin que mon ancienne réponse incorrecte puisse être supprimée. Merci.
ddaa
Une fois que la mise en évidence de la ligne actuelle sur lest implémentée sourceware.org/bugzilla/show_bug.cgi?id=21044 , je vais simplement ajouter là a hook-stopet entrer Dev Nirvana.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Réponses:

183

.gdbinit

Vous pouvez modifier votre ~/.gdbinitpour avoir des couleurs. Vous pouvez utiliser mammon .gdbinitqui est disponible ici:

https://github.com/gdbinit/gdbinit

Vous pouvez également le modifier autant que vous le souhaitez. J'ai trouvé cela grâce à cette réponse SO . Voici le type de sortie que vous pouvez obtenir:

.gdbinit

Un référentiel GitHub est également disponible: https://github.com/gdbinit/Gdbinit

Par ailleurs, la même idée a également été appliquée à lldb .

Tableau de bord GDB

Suivant le même concept, GDB Dashboard fournit une interface visuelle modulaire pour GDB en Python.

Tableau de bord GDB

(nul) marcheur

Un autre projet similaire utilise le support Python de GDB pour fournir plus d'extensibilité, cela vaut donc la peine de vérifier: https://github.com/dholm/voidwalker

@dholm fournit également son propre .gdbinit inspiré du précédent.

(nul) marcheur

pwndbg

Certains projets fournissent un ensemble de fonctions utiles, notamment un affichage amélioré. C'est le cas pour PEDA ou pwndbg . Ce dernier donne la description suivante:

Un remplacement PEDA. Dans l'esprit de notre bon ami windbg, pwndbgse prononce pwnd-bag.

  • La vitesse
  • Élasticité
  • Code propre

Il fournit des commandes pour prendre en charge le débogage et exploiter le développement similaires à ceux de PEDA, et un meilleur affichage (bien que ce ne soit pas l'objectif principal du projet). Le logiciel est encore en cours de développement et n'a pas encore été correctement publié.

pwndbg

Voltron

La description du projet indique:

Voltron est une interface utilisateur de débogage extensible pour les pirates. Il vous permet d'attacher des vues d'utilitaires s'exécutant dans d'autres terminaux à votre débogueur (LLDB ou GDB), affichant des informations utiles telles que le désassemblage, le contenu de la pile, les valeurs de registre, etc., tout en vous donnant le même CLI de débogage auquel vous êtes habitué.

Vous pouvez modifier votre .gdbinitpour l'intégrer automatiquement. Cependant, l'affichage lui-même est en dehors de GDB (par exemple dans un fractionnement tmux).

Voltron

FEM

Le FEM est une autre option, et il est décrit comme:

Il est destiné à être utilisé principalement par les exploiteurs et les rétro-ingénieurs, pour fournir des fonctionnalités supplémentaires à GDB en utilisant l'API Python pour aider au cours du processus d'analyse dynamique et de développement d'exploit.

FEM

BenC
la source
merci beaucoup pour votre réponse, avez-vous une idée comment désactiver la sortie du registre? (J'utilise gdb pour le code C ++ et je n'ai pas besoin de niveau assembleur tout de suite)
vak
Oui. Merde "Les commentaires doivent comporter au moins 15 caractères."
vak le
1
@vak avez-vous essayé set $SHOWCPUREGISTERS = 0? Fondamentalement, vous avez plusieurs paramètres que vous pouvez définir et vous pouvez toujours modifier le code en fonction de vos besoins.
BenC
100

Ce n'est pas des couleurs, mais pensez GDB texte de IUG . Cela fait une énorme différence dans la façon dont gdb est utilisable.

Vous pouvez le lancer avec:

gdb -tui executable.out

Capture d'écran:

entrez la description de l'image ici

Comme vous pouvez le voir, les principales caractéristiques sont:

  • montre sur quelle ligne de la source nous nous trouvons et les lignes environnantes
  • affiche les points d'arrêt
John Carter
la source
5
Hou la la! Merci! Je cherchais depuis longtemps un bon shell graphique autour de gdb, et j'ai essayé xxgdb, kgdb et ddd, mais aucun d'entre eux ne fonctionnait très bien pour moi, donc je suis resté fidèle à l'ancienne interface de ligne de commande. Mais c'est absolument parfait!
Thomas Padron-McCarthy
46
Ctrl-x Ctrl-a: Entrez ceci pour basculer vers et depuis le mode de l'interface graphique de texte, fonctionne même sans l'option de ligne de commande.
jturcotte
2
L'impression vers stdout à partir du programme casse l'interface pour moi. Des solutions de contournement en plus de le rediriger?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
1
J'obtiens le même problème avec stdout cassant l'interface. Ctrl-L ou quelle que soit votre liaison de redessiner le rend utilisable au moins. Pour les personnes avec le mode d'édition vi activé, Ctrl-X Ctrl-A ne fonctionne pas, mais la commande 'layout src' vous mettra en mode TUI avec la source affichée comme l'image.
wilywampa
1
Ouvrez un deuxième terminal et exécutez la commande: $ tty Utilisez le résultat pour diriger stdout de la session gdb vers ce terminal à l'aide de la commande (gdb) set inferior-tty. ex. de mon .gdbinit set inferior-tty / dev / tty2 maintenant votre stdout ne gâchera pas $ gdb -tui.
netskink
46

Je sais que vous ne vouliez pas d'interface. Mais qu'en est-il de cgdb, il est très proche de gdb, il est en mode texte mais a une fenêtre source ci-dessus avec une mise en évidence de la syntaxe sur le code.

Johan
la source
2
sudo apt-get install cgdb
cs01
2
A real serendipity :)
Ignorant
J'ai juste essayé de l'exécuter: il ne voit pas d'historique gdb, et il a également une invite foutue, où il y a un espace entre le curseur et l'endroit réel où le symbole est tapé (c'est probablement parce que j'ai une invite colorée dans gdb ) . Pas du tout impressionné.
Hi-Angel
19

Il est possible d'améliorer considérablement l'apparence de gdb grâce à l'utilisation de couleurs. Cela se fait via l'une des méthodes suivantes:

  1. Invite colorisée via le "set prompt". Par exemple, mettez l'invite en gras et en rouge:

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

    ou donnez à l'invite une nouvelle forme, en gras et en rouge:

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

    entrez la description de l'image ici

  2. Commandes colorisées via des crochets

  3. Mise en évidence de la syntaxe colorisée de la commande "list".

Tous les exemples sont disponibles dans les articles de blog suivants écrits par Michael Kelleher:

«Beautify GDB», 12 mai 2010 (via archive.org)

«Mise en évidence expérimentale de la syntaxe GDB», 15 mai 2010 (via archive.org)

Mike
la source
14
Les liens sont rompus.
John Carter
7
@Mike: il serait utile d'afficher le contenu de ces liens ici car le site n'est plus accessible et le fichier robots.txt a empêché archive.org de l'indexer.
Lucian Adrian Grijincu
1
Vous pouvez obtenir les informations pertinentes ici: sourceware.org/gdb/current/onlinedocs/gdb/Prompt.html
musiphil
1
Les liens pointent maintenant vers un cache archive.org des articles du blog.
Alex Quinn
1
@Mike, il semble que vous soyez l'auteur des articles du blog; si tel est le cas, vous devez le divulguer dans la réponse.
David Z
13

Nouveau dans la prochaine GDB 8.3!

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

Le style de terminal est désormais disponible pour la CLI et le TUI. GNU Source Highlight peut également être utilisé pour donner un style aux extraits de code source. Voir les commandes "set style" ci-dessous pour plus d'informations.

capture d'écran de gdb 8.2.91.20190401-23.fc30

Elmarco
la source
Meilleure réponse JAMAIS! Vous pouvez trouver ici un tutoriel sur la façon d'installer gdb 8.3 medium.com/@simonconnah/… , notez que votre machine a besoin d'au moins 512 Mo de RAM, sinon, le gcccompilateur commencera à trash.
utilisateur
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 

Avertissement: Buggy. Pas de support TUI, piratage en «mode utilisateur».

J'ai trouvé la partie principale ici et l'ai un peu modifiée. Besoin de surligner, filt c ++. Si les couleurs sont gâchées, lancez la commande.

ftk
la source
7

cgdb est bien mieux que gdb -tui

justin.yqyang
la source
D'accord. Des lignes simples imprimées par mon programme ont détruit la console de gdb -tui. Cela ne se produit pas sous cgdb. Merci pour le conseil!
Randall Cook
4

Je voulais mettre en évidence comme suit: souligner les lignes d'une trace de pile qui appartiennent à mes fichiers source (plutôt que des bibliothèques).

La solution était d'utiliser gdb-python (sur MSYS; sous Linux gdbest généralement livré avec Python intégré déjà?), Hook backtrace, use

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

Puis traitez stack_traceavec les expressions rationnelles de Python et imprimez-les. Les couleurs grasses et autres sont obtenues par une fonction comme celle-ci:

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
la source
Un exemple fonctionnel utilisant le hook - même minime - serait probablement plus apprécié.
Hi-Angel
4

Une autre bonne combinaison de couleurs est donnée par cette configuration . Cela rend l'inspection des backtraces beaucoup plus facile. Pour l'utiliser, enregistrez simplement ce fichier sous ~/.gdbinitet exécutez gdb normalement

Andrea Araldo
la source
Merci, c'était précisément ce que je recherchais. Je cherchais une application multi-thread avec une longue pile d'appels et c'est parfait pour ces backtraces.
Johan Bjäreholt le
-2

vous pouvez obtenir toutes les couleurs que vous voulez;

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