Comment tracer les appels système effectués par un processus avec Strace sur Linux

Comment tracer les appels système effectués par un processus avec Strace sur Linux

Il y a des moments où il est utile d'inspecter ce que fait une application en cours d'exécution sous le capot, et quel système appelle-t-il pendant son exécution. Pour accomplir une telle tâche sur Linux, nous pouvons utiliser le se décrocher utilitaire. Dans cet article, nous verrons comment l'installer et nous apprendrons son utilisation de base.

Dans ce tutoriel, vous apprendrez:

  • Comment installer Strace
  • Comment utiliser Strace pour tracer les appels système faits par un processus
  • Comment filtrer les spécificités des appels système
  • Comment s'attacher à un processus déjà en cours d'exécution
  • Comment générer un résumé d'appel système
Comment tracer les appels système effectués par un processus avec Strace sur Linux

Exigences et conventions logicielles utilisées

Exigences logicielles et conventions de ligne de commande Linux
Catégorie Exigences, conventions ou version logicielle utilisée
Système Indépendant de la distribution
Logiciel Se décrocher
Autre Familiarité avec l'interface de ligne de commande et la gestion des processus Linux
Conventions # - Commands Linux à exécuter avec des privilèges racine soit directement en tant qu'utilisateur racine, soit par l'utilisation de Sudo commande
$ - Commands Linux à exécuter en tant qu'utilisateur non privilégié régulier

Installation

Bien qu'il ne soit pas installé par défaut, le se décrocher L'utilitaire est disponible dans les référentiels officiels de toutes les principales distributions Linux; Cela signifie que nous pouvons l'installer très facilement en utilisant notre gestionnaire de packages préféré.

Si nous courons sur Fedora (ou toute autre distribution dans la famille Red Hat), par exemple, nous devons utiliser DNF:

$ sudo dnf installer strace 


Si nous sommes plus à l'aise avec Debian ou des distributions basées à Debian telles que Ubuntu ou Linux Mint, nous pouvons utiliser apte Pour obtenir le même résultat:

$ sudo apt installer strace 

Si Arch Linux est notre distribution de choix, nous pouvons utiliser Pac-Man Pour installer l'application, qui est disponible dans le supplémentaire dépôt:

$ sudo pacman -s strace 

Avec le logiciel installé, nous pouvons avancer et voir quelques exemples de son utilisation.

Présentation de Strace

Comme nous l'avons déjà dit, se décrocher est un outil utilisé pour garder une trace des appels système effectués par un processus en cours et les signaux reçus par celui-ci. Les appels système sont l'interface fondamentale entre une application et le noyau Linux; Quand nous utilisons se décrocher, Le nom des appels effectués par un processus, ainsi que leurs arguments et valeurs de retour sont affichés sur stderr (Descripteur de fichier d'erreur standard).

Voyons une utilisation de base de se décrocher, Afin de se familiariser avec sa sortie. Dans son utilisation la plus élémentaire, nous appelons se décrocher suivi du programme que nous voulons exécuter et qui le comportement que nous voulons analyser. Pour le bien de cet exemple, nous copierons simplement un fichier en utilisant le CP commande:

$ strace cp ~ /.bashrc bashrc 

La sortie de la commande est assez longue, et bien sûr, nous ne pouvons pas l'analyser en détail; Voyons juste la première ligne. Chaque ligne dans le se décrocher La sortie contient:

  • Le nom d'appel système
  • Les arguments transmis à l'appel du système entre parenthèses
  • La valeur de retour d'appel système

Le premier appel système que nous pouvons voir dans la sortie est exécution. Cet appel est utilisé pour exécuter un programme avec un tableau d'arguments spécifié. Le premier argument accepté par execv est le chemin du fichier que nous voulons exécuter; Le second est un éventail de chaînes qui représente les arguments qui seront transmis au programme (le premier argument, par convention, étant le nom du programme lui-même).

Dans notre cas, comme prévu, le binaire qui s'appelle est / usr / bin / cp, et le tableau des arguments passés à l'appel est: le nom du programme (CP), la source et les chemins de destination:

execve ("/ usr / bin / cp", ["cp", "/ home / egdoc /.bashrc "," bashrc "], 0x7fff53d4e4c0 / * 46 vars * /) = 0 

Le / * 46 VARS * / La notation signifie que 46 variables où hérité du processus d'appel (dans le execv fonction que l'environnement est tiré de l'extérieur environ variable). Enfin, nous avons le valeur de retour, qui dans ce cas est 0 (En fait le exécutif La famille de la fonction renvoie une valeur uniquement si une erreur se produit).

Filtrage uniquement les appels système spécifiques

Lors de l'utilisation se décrocher Parfois, nous pouvons vouloir suivre uniquement les appels du système de spécificiaires effectués par un processus. Dans ces situations, nous pouvons utiliser le -e option suivie d'une expression qui indique quels appels de système doivent être tracés. Supposons que nous exécutions la même commande que nous avons utilisée dans l'exemple précédent, mais nous voulons seulement le lire Les appels système à afficher dans la sortie, nous l'exécuterions:

$ strace -e lire cp ~ /.bashrc bashrc 

Comme prévu, seulement lire Les appels sont signalés:

La sortie du «Strace -e lu Cp ~ /.Commande bashrc bashrc ” lire L'appel système prend trois arguments: le premier est un descripteur de fichiers associé au fichier qui doit être lu; Le second est le amortir dans lequel le fichier doit être lu, et le troisième est le nombre d'octets qui devrait être lu. Sur le succès, la fonction renvoie le nombre d'octets lus dans le fichier, comme nous pouvons observer dans la sortie de ce qui précède.

Attacher Strace sur un processus de course

Jusqu'à présent, nous avons invoqué se décrocher en passant par la commande à exécuter et à maintenir la trace de; Et si nous voulons retracer un processus existant et déjà en cours d'exécution? Dans ce cas, nous devons invoquer se décrocher avec le -p (ou --attacher) option et passer le Piquer (ID de processus) du processus auquel nous voulons le fixer.

Pour trouver le PID d'un programme, parmi les autres solutions, nous pouvons utiliser le picof utilitaire. Pour le bien de cet exemple, nous attacherons Strace à une instance en cours d'exécution de serveur de gnome-terminal:

$ pidof gnome-terminal-server 121316 


Le picof Commande retournée 121316, qui est le PID du serveur de gnome-terminal. Sachant cela, nous pouvons attacher se décrocher au processus:

$ Strace -P 121316 

La commande ci-dessus renverra initialement quelque chose comme:

La sortie de la commande «Strace -P 121316» La sortie ci-dessus (tronquée) sera mise à jour «à la volée» lorsque les appels système sont effectués. À «détacher» se décrocher Nous pouvons simplement appuyer Ctrl + c sur le clavier; Nous serons informés du «détachement», mais le processus tracé continuera de s'exécuter:
Strace: processus 121316 détaché 

Signaux de traçage

Grâce à se décrocher Nous pouvons également observer lorsqu'un processus reçoit un signal et comment il y réagit. Laisse-moi le démontrer. Tout d'abord, nous lançons un processus de longue date comme haut, qui est un moniteur de processus:

$ top 

Nous attachons se décrocher à lui, après avoir obtenu son pid, qui dans ce cas est 44825:

$ Strace -P 44825 

À ce point se décrocher commence à suivre les appels du système effectués par haut, mais aussi les signaux reçus par lui. Pour le prouver, nous envoyons un Sigterm Pid 44825:

$ tuer 44825 

Comme prévu, l'événement est signalé dans le se décrocher sortir:

--- SIGTERM SI_SIGNO = SIGTERM, SI_CODE = SI_USER, SI_PID = 44888, SI_UID = 1000 --- 

Dans la sortie ci-dessus si_signo Le nombre de signaux est-il livré (Sigterm = 15), si_code contient un code qui identifie la cause du signal (si_user = 0): dans ce cas, le signal a été généré par un processus utilisateur. Le si_pid et si_uid Les champs rapportent, respectivement, le Piquer du processus d'envoi et de son Uid.

Enregistrer la sortie de Strace dans un fichier

Si nous utilisons le -o Option (abréviation pour --ouput) lors du lancement se décrocher, Nous pouvons rediriger sa sortie vers un fichier, passant un chemin comme argument, par exemple:

$ Strace -P 121316 -o Strace_Output Strace: Processus 121316 Attaché 

Le strace_output le fichier sera créé et la sortie de se décrocher sera écrit à l'intérieur. Pour regarder la mise à jour dans le fichier, nous pouvons utiliser le queue: normalement, cette commande lit les 10 dernières lignes d'un fichier et sort, mais si nous l'appelons avec le -F Option (abréviation pour --suivre) Nous pouvons observer que le nouveau contenu est annexé:

$ tail -f strace_output 


Imprimez un résumé des appels du système

Le se décrocher L'utilitaire est livré avec une fonctionnalité très utile: la possibilité de générer un résumé de tous les appels système effectués par un processus spécifié. Si nous voulons générer un tel rapport, tout ce que nous avons à faire est d'invoquer le programme avec le -c ou --uniquement option. Prenons comme exemple le CP Commande que nous avons utilisée avant:

$ strace -c cp ~ /.bashrc bashrc 

La commande ci-dessus générera ce rapport:

% Time secondes usecs / appels appels erreurs syscall ------ ----------- ----------- --------- ---- ----- ---------------- 25.71 0.000298 7 38 13 OpenAT 19.24 0.000223 4 51 mmap 11.48 0.000133 4 28 CLOSE 9.92 0.000115 57 2 1 newfstatat 7.94 0.000092 10 9 MPROTECT 6.99 0.000081 3 25 fstat 2.85 0.000033 3 11 Read 2.76 0.000032 16 2 Munmap 2.50 0.000029 14 2 STATFS 1.90 0.000022 22 1 Écrivez 1.55 0.000018 2 8 Pread64 1.38 0.000016 8 2 1 Accès 1.04 0.000012 4 3 brk 0.78 0.000009 4 2 RT_SIGACTION 0.60 0.000007 7 1 Futex 0.52 0.000006 3 2 1 Arch_prctl 0.43 0.000005 5 1 RT_SIGProcmask 0.43 0.000005 5 1 set_tid_address 0.43 0.000005 5 1 fadvise64 0.43 0.000005 5 1 set_robust_list 0.43 0.000005 5 1 prlimit64 0.26 0.000003 3 1 1 Stat 0.26 0.000003 3 1 1 lseek 0.17 0.000002 2 1 Geteuid 0.00 0.000000 0 1 EXECVE ------ ----------- ----------- --------- --------- ---------------- 100.00 0.001159 5 196 18 Total 

Comme vous pouvez le voir, puisque nous avons généré un résumé, la sortie normale de se décrocher n'est pas affiché. Si nous voulons générer le résumé mais toujours obtenir la production régulière du programme, nous devons utiliser le -C option à la place, qui est la forme courte de --résumé.

Conclusions

Dans ce tutoriel, nous avons appris à installer et à utiliser se décrocher, Un bel utilité utile à des fins de débogage et plus généralement pour garder une trace des appels système effectués par un processus. Nous avons vu comment la sortie de se décrocher est organisé, comment lancer un programme et garder une trace des appels du système, comment attacher se décrocher à un processus déjà en cours d'exécution et comment les signaux reçus par un processus sont notifiés; Enfin, nous avons vu comment générer un résumé de tous les appels passés par un processus. Ici, nous avons à peine rayé la surface de ce que nous pouvons faire avec se décrocher: Si vous voulez en savoir plus, le conseil est, comme toujours, de lire le manuel!

Tutoriels Linux connexes:

  • Choses à installer sur Ubuntu 20.04
  • Choses à faire après l'installation d'Ubuntu 20.04 Focal Fossa Linux
  • Fichiers de configuration Linux: 30 premiers
  • Une introduction à l'automatisation Linux, des outils et des techniques
  • Choses à installer sur Ubuntu 22.04
  • Système linux hung? Comment s'échapper vers la ligne de commande et…
  • Comment utiliser la commande tcpdump sur Linux
  • Linux peut-il obtenir des virus? Exploration de la vulnérabilité de Linux…
  • Choses à faire après l'installation d'Ubuntu 22.04 Jammy Jellyfish…
  • Mint 20: Mieux que Ubuntu et Microsoft Windows?