Un programme ne fonctionne pas ? Il plante sans raison apparente ? **strace** et **ltrace** sont tes meilleurs alliés pour comprendre ce qu'un programme fait vraiment — en regardant les appels système et les appels aux bibliothèques partagées.
**strace** intercepte et enregistre les **appels système** (syscalls) qu'un programme effectue vers le noyau Linux. Chaque fois qu'un programme ouvre un fichier, lit du réseau, alloue de la mémoire ou crée un processus, c'est un appel système.
En gros : strace te montre la conversation entre le programme et le noyau.
sudo apt install strace
# Vérifier qu'il fonctionne
strace -V
strace ls -l /tmp
# Lancer et tracer un script
strace ./mon_script.sh
Tu verras une longue liste d'appels comme :
brk(NULL) = 0x55a3c000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT
open("/etc/ld.so.cache", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=...) = 0
mmap(NULL, ..., PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f...
open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY) = 3
Chaque ligne strace suit ce format :
^nom de l'appel ^ses arguments ^valeur de retour (fd=3)
ENOENT = fichier non trouvé, EACCES = permission refusée)strace -e openat ls /tmp
# Plusieurs appels système à surveiller
strace -e trace=open,read,write cat /etc/hostname
strace -c ls /tmp
# Résultat :
# % time seconds usecs/call calls errors syscall
# ------ ----------- ----------- --------- --------- -------
# 35.00 0.000210 12 17 mmap
# 20.00 0.000120 8 15 openat
# 15.00 0.000090 6 15 fstat
# ...
# 100.00 0.000600 11 52 total
strace -e trace=open -P /root ls /tmp
# Ou capturer dans un fichier (sans polluer le terminal)
strace -o /tmp/trace.txt ls /tmp
# Lire le fichier de trace
less /tmp/trace.txt
ps aux | grep firefox
# Attacher strace à un processus en cours
sudo strace -p 1234
# Suivre aussi les processus enfants (fork)
sudo strace -fp 1234
strace -t ls /tmp
# Temps absolu
strace -tt ls /tmp
# Durée de chaque appel
strace -r ls /tmp
**ltrace** intercepte les **appels aux bibliothèques partagées** (librairies .so). Là où strace montre les appels au noyau, ltrace montre les appels aux fonctions des bibliothèques (libc, pthread, etc.).
sudo apt install ltrace
# Lancer et tracer les appels bibliothèques
ltrace ls /tmp
Exemple de sortie :
malloc(32) = 0x55a...
strcmp("HOME", "HOME") = 0
getenv("HOME") = "/home/david"
strlen("/home/david") = 10
strcpy(0x55..., "/home/david") = 0x55...
ltrace -c ls /tmp
# Suivre un nom de fonction précis
ltrace -e malloc,free ls /tmp
# Attacher à un processus existant
sudo ltrace -p 1234
# Afficher les paramètres des fonctions
ltrace -i ls /tmp
strace -e openat ./mon_programme 2>&1 | grep ENOENT
# Ou chercher "Fichier introuvable"
strace -e openat ./mon_programme 2>&1 | grep -i "Aucun fichier"
Tu verras exactement quel fichier le programme essaie d'ouvrir.
strace -e trace=open,execve ./programme_fantome 2>&1 | grep -E "ENOENT|EACCES|ERR"
# Déboguer avec les signaux ( voir comment le programme se termine)
strace -e signal=none -e trace=none -f ./programme_fantome
strace -c -e trace=open,read,write,execve ./programme_lent
# Vérifier si des fichiers sont ouverts inutilement
strace -e openat ./programme_lent 2>&1 | head -30
strace -e trace=connect,socket,bind ./mon_service
# Tracer aussi send/recv
strace -e trace=network ./script_reseau
strace -f -o /tmp/script_trace.log ./script.sh
# Lire le fichier de trace
grep -E "ENOENT|EACCES" /tmp/script_trace.log
| Outil | Ce qu'il trace | Cas d'usage |
|---|---|---|
ltrace | Appels aux bibliothèques partagées | Fonctions malloc/free, printf, libc |
strace -c | Résumé statistique | Trouver les goulots d'étranglement |
strace -p | Processus existant (PID) | Déboguer un programme déjà lancé |
(strace -f -e trace=execve ./programme 2>&1) | grep ENOENT
(ltrace -f ./programme 2>&1) | grep NULL
# Enregistrer les deux dans des fichiers séparés
strace -o /tmp/strace.log ./programme &
ltrace -o /tmp/ltrace.log ./programme
**Warning** : ⚠️ **Performance** : strace ralentit considérablement le programme tracé (surtout avec
-f). Utilise-le sur des programmes qui ne sont pas en production critique, ou en lecture seule.
**Objectif :** Utilise strace et ltrace pour comprendre le comportement d'un programme simple.
sudo apt install strace ltracestrace -e openat ls /var/log 2>&1 | head -20lsstrace -c ls /tmpltrace -c ls /tmp 2>&1 | head -20cat /etc/hostname
mkdir /tmp/test_debug
echo "OK" > /tmp/test_debug/fichier.txt
strace -f -o /tmp/script_trace.log ./test.shgrep -E "ENOENT|EACCES" /tmp/script_trace.logltrace sur le script : ltrace -f ./test.sh 2>&1 | grep getenv| Commande | Rôle |
|---|---|
strace -e openat <commande> | Ne tracer qu'un appel précis |
strace -c <commande> | Résumé statistique des appels |
strace -p <PID> | Attacher à un processus existant |
strace -o fichier.log <commande> | Sauvegarder la trace dans un fichier |
ltrace <commande> | Tracer les appels aux bibliothèques |
ltrace -c <commande> | Résumé statistique des appels bibliothèques |
strace -f <commande> | Suivre aussi les processus enfants (fork) |
strace et ltrace sont des outils puissants pour comprendre ce qui se passe vraiment dans un programme. En cas de doute, trace tout et cherche les erreurs — elles ne mentent jamais.