GNU/Linux >> Tutoriels Linux >  >> Linux

Comment utiliser les commandes strace et ltrace sous Linux

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.


Linux
  1. Comment utiliser les commandes de recherche et de localisation sous Linux :Guide du débutant

  2. Comment enregistrer les commandes Linux et les utiliser à la demande

  3. Comment utiliser les commandes Pbcopy et Pbpaste sous Linux

  4. Comment installer et utiliser Git dans le système Linux

  5. Comment installer et utiliser Glances pour surveiller les systèmes Linux

Comment installer et utiliser Skype sur le système Linux. C'est maintenant plus facile

Comment installer et utiliser le compilateur GCC sur le système Linux

Comment monter et utiliser un lecteur exFAT sur un système Linux

Comment installer et utiliser Tmux (multiplexeur de terminaux) dans le système Linux

Comment installer et utiliser AsciiDoc dans le système Linux

Comment installer et utiliser l'émulateur de terminal Konsole dans le système Linux