Dans cet article nous présenterons diverses couches graphiques gratuites de GDB. Nous présenterons succintement leur installation suivie de quelques cas d’usage.
Améliorer la sortie de GDB
Pour commencer, il est possible de rendre GDB un peu plus lisible. En utilisant le fichier de configuration gdbinit, localisé dans votre $HOME. Il existe de nombreux fichier et de nombreuse manière d’adapter GDB par ce biais. Il est possible et conseillé d’en prendre un « tout fait ». Par exemple ICI.
Voici une procédure d’installation simplifiée:
cd #se placer dans le $HOME wget https://raw.githubusercontent.com/gdbinit/Gdbinit/master/gdbinit mv gdbinit .gdbinit
Vous pouvez maintenant aprécier un GDB un peu plus verbeux:
Le mode TUI de GDB
GDB fournit nativement une vue graphique basée sur ncurses. Elle permet de mieux visualiser le code source et ou l’assembleur. Pour voir l’aide relative à cette interface faites :
(gdb) help layout Change the layout of windows. Usage: layout prev | next | <layout_name> Layout names are: src : Displays source and command windows. asm : Displays disassembly and command windows. split : Displays source, disassembly and command windows. regs : Displays register window. If existing layout is source/command or assembly/command, the register window is displayed. If the source/assembly/command (split) is displayed, the register window is displayed with the window that has current logical focus.
On retrouve ici différents layouts que nous allons rapidement illuster. Coté usage ces interfaces sont pratiques quand le mode ligne de commande ne suffit plus. Le vue source pour se « retrouver » dans le code. Du coté de l’assembleur, la vue « regs » est à privilégier. Vous noterez tout de même que parfois le TUI a des problèmes de rafraichissement. C’est pour cela que des solutions telles que CGBD peuvent être préférables.
Le mode source
(gdb) layout src
Le mode assembleur
(gdb) layout asm
Le mode assembleur
(gdb) layout split
Le mode registres
(gdb) layout regs
CGDB
CGDB est une surcouche NCURSES à GDB. Ce programme est très pratique pour avoir un contexte tout en reposant sur une interface parfaitement fonctionnelle. Vous verrez que cela vaut beaucoup mieux que le mode TUI.
Tout d’abord installons CGDB:
sur Centos 7:
yum install cgdb
Et sur Ubuntu:
apt-get install cgdb
Ensuite CGDB s’utilise exactement comme GDB depuis la ligne de commande. Cela à la différence que l’interface est maintenant dans un mode proche du TUI de gdb.
Les commandes de base:
- ECHAP : Passer dans les sources
- En mode source haut et bas pour se déplacer
- /abc pour rechercher abc
- ESPACE pour ajouter un breakpoint à la ligne courante
- « – » pour diminuer la fenêtre du code
- « = » pour augmenter la fenêtre du code
- :123 pour se rendre à la ligne 123
- :help pour l’aide
- :q pour quitter
- « o » pour ouvrir un fichier
- F5 : run
- F6 : continue
- F7 : finish
- F8 : next
- F10 : step
- « i » pour repasser en mode commande (depuis le mode ECHAP)
- Toutes les commandes GDB sont applicable sauf TUI
- Notez que votre .gdbinit peut conflicter et laisser des codes couleur dans la sortie
- PAGE UP : déplacer vers le haut
- PAGE DOWN : déplacer vers le bas
Data Display Debugger
Le debugger DDD pour Data Display Debugger peut paraître un peu vintage mais il est l’un des front-end les plus avancé. Il fournit par exemple des fonctionnalités graphiques égalées uniquement par des débugueur commerciaux tels que DDT (à ne pas confondre).
DDD s’installe très simplement:
sur Centos 7:
yum install ddd gnuplot
Et sur Ubuntu:
apt-get install ddd gnuplot
Observons le code suivant :
#include <stdio.h> #include <math.h> int main( int argc, char **argv ) { double tab[100][100]; int i,j; for(i = 0 ; i < 100 ; i++) { for(j = 0 ; j < 100 ; j++) { tab[i][j] = sin( i * 2.0*3.14/100 ) * sin( j * 2.0*3.14/100 ) ; } } return 0; }
Et compilons le ainsi en débug (-g) et en liant la lib math (-lm-:
gcc ./sin.c -o sin -g -lm
Ensuite lancez DDD :
ddd
Allez dans les paramètes (menu edit>preferences) puis choisissez l’onglet « helper ». Enfin pour plot window choisissez « external ». Le but de cette manipulation est de contourner un bug de DDD empêchant l’ouverture de GNUPLOT — vous être libre d’essayer ainsi peut être que cela marchera chez vous.
Ouvrez votre binaire et cliquez trois fois sur la dernière ligne du main pour placer un breakpoint. Puis lancez le en cliquant sur « run » dans la boite à outils. Une fois le programme stoppé, le tableau tab sera remplis avec un sinus 3D. Maintenant affichons le ! Surlignez tab dans le code et cliquez sur « plot » en haut a droites :
Constatez également que la fenêtre est interractive ! Le programme appelé est gnuplot. Cela peut bien entendu se reproduire en 2D:
Voilà qui rend DDD pas si vintage que cela et particulièrement utile pour des applications numériques en particulier. Concentrons nous maintenant sur une dernière fonctionnalité, l’exploration des structures de données. Considérons le programme suivant:
#include <stdio.h> #include <stdlib.h> struct block { int val; struct block *prev; }; struct block * new_block( int val ) { struct block * ret = malloc(sizeof(struct block)); ret->val = val; return ret; } int main(int argc, char **argv) { int i; struct block * blocks = NULL; for( i = 0 ; i < 3 ; i++ ) { struct block * new = new_block( i ); new->prev = blocks; blocks = new; } return 0; }
Compilons ce code en débug:
gcc ./ls.c -o ls -g -lm
Lancons le dans DDD, ensuite placez un breakpoint sur la dernière ligne. Puis lançez le programme. Maintenant, faites display sur la variable « block ». Ensuite double cliquez sur son addresse. Ensuite double-cliquez sur le pointeur prev de chacun des blocs et admirez:
En résumé, DDD est un débugueur singulier qui vaut le détours. Il est pratique pour explorer le contenu des variables et des structures de données complexes de manière visuelle.
Nemiver
Bientôt