Rust : Debug avec GDB
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.