Débogage de code Rust : de « println! » aux outils pro
Quiconque a écrit du Rust ne serait-ce qu'une semaine connaît ce sentiment : le compilateur a laissé passer, le programme s'est compilé, se lance… et fait quelque chose de totalement inattendu. Ou alors il plante simplement avec un mystérieux Segmentation fault. Bienvenue dans le monde du débogage ! Bonne nouvelle : Rust dispose pour cela de tout un arsenal, de la simple macro aux débogueurs avancés. Dans cet article, nous allons passer en revue toutes les méthodes de débogage de code Rust, des plus basiques aux plus professionnelles.
1. Le kit de base : les macros dbg! et eprintln!
Commençons par le plus simple et le plus accessible. Si vous écrivez du code Rust et voulez comprendre rapidement ce qui se passe dans les variables, utilisez dbg!. Il affiche à la fois le nom de la variable, sa valeur, ainsi que le fichier et la ligne. Beaucoup plus pratique que le bon vieux println!.
fn calculate_even_sum(numbers: &[i32]) -> i32 { let mut sum = 0; for &n in numbers { if n % 2 == 0 { sum += n; dbg!(n, sum); // on regarde chaque nombre pair et la somme actuelle } } sum}
fn main() { let data = vec![1, 2, 3, 4, 5, 6]; let result = calculate_even_sum(&data); dbg!(result);}Exécutez-le et vous verrez quelque chose comme :
[src/main.rs:6:13] n = 2[src/main.rs:6:13] sum = 2[src/main.rs:6:13] n = 4[src/main.rs:6:13] sum = 6[src/main.rs:6:13] n = 6[src/main.rs:6:13] sum = 12[src/main.rs:12:5] result = 12Et si vous avez besoin d'écrire sur stderr (par exemple, pour ne pas interférer avec stdout lors des pipes), utilisez eprintln!. C'est indispensable pour le débogage de code Rust en environnement de production.
2. Journalisation avancée avec log et env_logger
Quand le projet grandit, parsemer dbg! dans tout le code devient pénible. Les crates log et env_logger viennent à la rescousse. Ils permettent d'activer/désactiver les logs sans recompilation.
use log::{info, warn, error, debug};
fn main() { env_logger::init();
info!("Programme démarré"); let x = 42; debug!("Valeur de x : {}", x);
if x > 100 { warn!("x est trop grand !"); } else { error!("Ce n'est pas une erreur, juste un test"); }}Lancez avec la variable d'environnement RUST_LOG=debug cargo run et vous obtiendrez tous les logs. Vous voulez seulement les avertissements ? RUST_LOG=warn. Très pratique pour le débogage d'applications Rust en temps réel.
3. Panique et backtrace : lire la pile d'erreurs
Quand un programme panique, Rust affiche un message. Mais cela ne suffit souvent pas. Activez le backtrace complet :
$ RUST_BACKTRACE=1 cargo runOu pour une granularité maximale :
$ RUST_BACKTRACE=full cargo runVous verrez toute la pile d'appels, du point de panique jusqu'à main. C'est crucial pour le débogage de code Rust si vous ne comprenez pas d'où vient l'erreur.
Exemple : supposons que vous ayez ce code :
fn main() { let v = vec![1, 2, 3]; println!("{}", v[10]); // panique !}Avec RUST_BACKTRACE=1, vous verrez non seulement "index out of bounds", mais aussi la ligne et l'appel exacts.
4. Mode débogage et optimisation : debug vs release
Point important : le débogage de code Rust en mode debug (par défaut) fournit des informations complètes. Mais en mode release, le compilateur optimise le code, et certaines variables peuvent disparaître ou changer d'ordre. Si vous déboguez un bug « release », utilisez un profil avec des informations de débogage :
[profile.release]debug = trueDans Cargo.toml. Cela vous permettra d'exécuter cargo run --release
Blogs
Book Recommendations
Lire aussi
Rate Limiting et Throttling en Go : Guide complet avec exemples
Revue de code en C# : 7 choses qui énervent les développeurs seniors
GOPATH dans Ubuntu : 5 erreurs fatales et comment le configurer correctement
Erreur Type 'string' is not assignable to type : comprendre et corriger en TypeScript
Monorepo avec PHP : organisation du code pour débutants