La commande strace
La commande strace peut être utilisée pour intercepter et enregistrer les appels système effectués et les signaux reçus par un processus. Cela permet d'examiner la couche limite entre l'utilisateur et l'espace du noyau, ce qui peut être très utile pour identifier pourquoi un processus échoue.
L'utilisation de strace pour analyser comment un programme interagit avec le système est particulièrement utile lorsque le code source n'est pas facilement disponible. En plus de son importance dans le dépannage, strace peut fournir des informations approfondies sur le fonctionnement du système. Tout utilisateur peut tracer ses propres processus en cours d'exécution ; en outre, l'utilisateur root peut tracer tous les processus en cours d'exécution. Par exemple, les éléments suivants peuvent être utilisés pour se connecter et tracer le démon rsyslogd en cours d'exécution :
# strace -p $(pgrep rsyslogd) Process 819 attached select(1, NULL, NULL, NULL, {83009, 275934} ...
Sortie de trace
La sortie de strace correspondra soit à un appel système, soit à un signal. La sortie d'un appel système comprend trois composants :
1. L'appel système
2. Tous les arguments entourés de parenthèses
3. Le résultat de l'appel suivant un signe égal
Un état de sortie de -1 indique généralement une erreur. Par exemple :
# strace ls file1 execve("/bin/ls", ["ls", "file1"], [/* 21 vars */]) = 0 brk(0) = 0xadb000 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f516bb79000 ..... close(1) = 0 munmap(0x7f516bb78000, 4096) = 0 close(2) = 0 exit_group(0) = ? +++ exited with 0 +++
Les accolades sont utilisées pour indiquer les structures C déréférencées. Les accolades sont utilisées pour indiquer des pointeurs simples ou un tableau de valeurs.
Exemples de commande strace
Redirection de la trace vers un fichier
Étant donné que strace crée souvent une grande quantité de sortie, il est souvent pratique de la rediriger vers un fichier. Par exemple, les éléments suivants peuvent être utilisés pour lancer le shell bash, suivre tous les processus enfants dupliqués et enregistrer tous les accès aux fichiers dans le fichier files.trace :
# strace -f -o files.trace -e trace=file bash
Compter le nombre d'appels système
Exécutez la commande ls en comptant le nombre de fois où chaque appel système a été effectué et imprimez les totaux indiquant le nombre et le temps passé dans chaque appel (utile pour le profilage de base ou l'isolation des goulots d'étranglement) :
# strace -c ls
Affichage des fichiers ouverts par un processus/démon
L'exemple suivant montre les trois fichiers de configuration que le sshd d'OpenSSH lit au démarrage. Notez que strace envoie sa sortie à STDERR par défaut, donc si vous voulez la rediriger vers d'autres commandes comme grep pour une modification supplémentaire, vous devez rediriger la sortie de manière appropriée :
# strace -f -eopen /usr/sbin/sshd 2>&1 | grep ssh
Tracer uniquement les appels système liés au réseau
Suivez uniquement les appels système liés au réseau lorsque Netcat tente de se connecter à un service telnetd local :
# strace -e trace=network nc localhost 23
La commande ltrace
La commande ltrace peut être utilisée pour intercepter et enregistrer les appels dynamiques effectués vers les bibliothèques partagées. La quantité de sortie générée par la commande ltrace peut être écrasante pour certaines commandes (en particulier si l'option -S est utilisée pour afficher également les appels système). Vous pouvez concentrer la sortie sur l'interaction entre le programme et une liste de bibliothèques. Par exemple, pour exécuter la commande id -Z et afficher les appels effectués au module libselinux.so, exécutez :
$ ltrace -l /lib/libselinux.so.1 id -Z is_selinux_enabled(0xc1c7a0, 0x9f291e8, 0xc1affc, 0, -1)a =1 getcon(0x804c2c8, 0xfee80ff4, 0x804b179, 0x804c020, 0)a =0 user_u:system_r:unconfined_t
N'oubliez pas que vous pouvez voir à quelles bibliothèques un programme est lié à l'aide de la commande ldd.