Rust : Debug avec GDB

De Justine's wiki
Aller à la navigation Aller à la recherche

GDB ?

GDB est le debugger du projet GNU. Celui-ci est portable et peut fonctionner avec de nombreux langages; cet article s'intéresse à son utilisation avec Rust.

Celui-ci s'attache à un process; l'exécutable du process doit avoir été compilé avec les symboles de debug adaptés à gdb.

Install

GDB est dispo partout; sur Arch, je commence par l'installer avec

sudo pacman -S gdb

Puis je me rends dans un de mes projets Rust. Rust a sa propre utilisation de gdb, rust-gdb.

Préparation du code

L'utilisation de gdb nécéssite un profil particulier au niveau de Rust, qui va permettre à GDB de disposer de ses symboles pour qu'il puisse fonctionner.

Pour cela, je modifie mon profil dev dans mon Cargo.toml:

[profile.dev]
opt-level=0
debug = true

Puis je recompile:

cargo build

Utilisation de gdb

Je peux lancer gdb sur mon programme (en l'occurence sqish) avec:

rust-gdb target/debug/sqish

Je me retrouve alors dans une CLI. Les commandes les plus importantes sont:

  • set startup-with-shell off : dans ce cas, gdb essaye de lancer le programme à débugger avec un shell. Cette commande désactive ce comportement : mon shell n'étant pas standard, il n'est pas supporté.
  • display src : afficher le code source.
  • break <nomdefonction> : Ajouter un break lors de la fonction untel, une pause qui va permettre de regarder ce qu'il se passe.
  • break<chemindefichier:123> : Ajouter un break au fichier donné à la ligne 123.
  • n : next (prochaine ligne) : une fois arrivée à mon break, je peux procéder ligne par ligne.
  • run : Lancer le programme. Nécessaire avant de pouvoir debugger.
  • c : continue : Une fois au break, je peux reprendre l'exécution.

Tout ça c'est bien, mais ce n'est pas très pratique...

gdbgui

GDBGui est une implémentation en python qui ouvre une interface assez pratique dans le navigateur local. Il s'installe avec pip:

python3 -m pip install gdbgui

Je peux ensuite lancer avec gdbgui et me rendre sur http://localhost:5000


Ici, je l'ai lancé, j'ai utilisé la commande set startup-with-shell off pour éviter les problèmes de compatibilité avec mon shell maison, et dans "load binary" en haut, j'ai donné le chemin de mon exécutable. Juste en dessous, dans "fetch source files", je donne le chemin de mon fichier source.

J'ai ma ligne de commande gdb en bas à gauche, mon shell en bas à droite, et du log en bas au milieu. Je peux ensuite utiliser gdb normalement : ajouter un break point, etc. Sur la droite de la fenêtre, j'ai les valeurs de mes variables. Plutôt cool.