Cómo utilizar ltrace para rastrear llamadas a la biblioteca

Contenu

Bash Shell

Êtes-vous intéressé à corriger les bogues de bibliothèque et les bogues que vous voyez lors de l'installation d'un nouveau programme sympa sur Linux ?? Consultez cet article qui montre comment utiliser ltrace et vous fournit l'outil nécessaire pour déboguer les appels de bibliothèque.

Qu'est-ce qu'un Une bibliothèque?

La plupart des gens connaissent .dll/.DLL enregistrements (bibliothèques de liens dynamiques) en Windows. Le même Linux est un .so déposer, un objet partagé, souvent appelé simplement une bibliothèque.

Une bibliothèque peut être utilisée par une application qui permet à ce programme d'utiliser des fonctionnalités externes à son code de programme.. Par exemple, un serveur Web peut vouloir utiliser une bibliothèque de E / Disque S écrit par le fournisseur du système d'exploitation ou un autre tiers. C'est une façon de partager des biens et des intérêts communs dans la majorité, sinon en tout, systèmes d'exploitation.

Les bibliothèques peuvent être chargées dynamiquement au moment de l'exécution (lorsque le programme appelant démarre, par exemple) ou ils peuvent être compilés dans une application cible / des pistes. C'est à cause de ça, chargera toujours (qu'ils soient utilisés ou non), dans le cadre et tant que l'application qui les a compilés est démarrée / intégré.

Pour plus d'informations sur les bibliothèques, ses dépendances et ldd outil, vous voudrez peut-être lire sur la façon de travailler avec les dépendances d'objets partagés sous Linux. Les ldd est un autre outil utile à avoir dans toute boîte à outils utilisateur Linux plus avancée.

Qu'est que c'est dessiner?

Il existe plusieurs utilitaires de trace sous Linux, comme strace pour suivre les appels et les signaux du système et le traceroute pour tracer le routage du réseau. Les ltrace Utilitaire / l'outil suit tous les appels de bibliothèque.

Si vous avez lu notre travail sur les dépendances d'objets partagés (une bibliothèque) dans l'article Linux (lié ci-dessus), Vous avez déjà vu comment vous pouvez trouver à quelles bibliothèques un binaire particulier est lié en utilisant le ldd outil. Le but et la fonctionnalité de ltrace c'est quelque chose de différent; très conforme à strace, Les ltrace La commande suit tous les appels de bibliothèque effectués par un programme particulier lors de son exécution.

Égal à strace, nous pouvons démarrer un programme au dessous de (Pensez-y comme une hiérarchie) ltrace. Nous spécifions simplement le programme qui ltrace devrait commencer comme le premier choix pour ltrace, Oui ltrace démarrera ce programme pour nous et commencera immédiatement (à un niveau supérieur) pour suivre tous les appels vers n'importe quelle bibliothèque (système d'exploitation ou tiers installé).

Il le fait en interceptant et en enregistrant les dynamique appels à la bibliothèque effectués par le programme en cours d'exécution. En même temps, il suivra tout signal envoyé au programme en cours, très identique à strace (Oui, si vous le souhaitez, cette fonctionnalité peut être désactivée en spécifiant le -b ou identique --no-signals option une ltrace).

A noter que le terme dynamique est d'une grande importance ici; ltrace tracera les appels vers externe bibliothèques (sous la forme de .so O .a enregistrements), en d'autres termes, bibliothèques non compilées directement dans un programme; dynamique Bibliothèques. C'est à cause de ça, si vous avez un binaire avec des bibliothèques statiquement (compilé), ltrace ne pourra pas voir / tracer ces appels internes.

installation dessiner

Instalando ltrace en la línea de comando con apt

Installer dessiner sur votre distribution Linux basée sur Debian / Apte (comme Ubuntu et Mint), exécutez la commande suivante dans votre terminal:

sudo apt install ltrace

Installer dessiner sur votre distribution Linux basée sur RedHat / Miam (comme RHEL, Centos et Fedora), exécutez la commande suivante dans votre terminal:

sudo yum install ltrace

Usando ltrace

Configuremos un pequeño entorno de prueba:

sudo apt install tar xz-utils
mkdir ~/workspace && cd ~/workspace
touch a b c

Aquí instalamos tar Oui xz instalando xz-utils (puedes usar sudo yum install tar xz à sa place, si está usando Centos / RHEL / Feutre). A continuación creamos un directorio ~/workspace y saltó a él. Posteriormente hicimos tres archivos vacíos usando el touch commander, a savoir, enregistrements a, b Oui c.

Commençons par compresser nos trois fichiers en un seul (le goudron combiné et xz comprimé) archive.tar.xz déposer, en jouant la même basse ltrace, et en observant le ltrace production:

Notre première trace de goudron

ltrace tar -hcf --xz archive.tar.xz *

Nous ne voyons qu'une petite quantité de sortie. Nous pouvons voir que notre programme s'est terminé avec succès (le fichier d'archive a été créé), en d'autres termes, status 0: un code de sortie de 0 signifie toujours le succès sur Linux (même si le programme doit avoir des codes de sortie correctement implémentés).

Ce n'est pas très utile pour l'instant. Raison de quelques secondes sur la façon dont tar opérera ici révélera rapidement notre prochaine approche. Le lecteur avide peut en même temps avoir compris que le tar La commande appellerait en interne le xz commander. Les --xz option passée à notre tar la ligne de commande garantira que le xz Le programme est utilisé pour la compression.

La procédure secondaire (ou le troisième dans la hiérarchie générale) en d'autres termes xz (hiérarchie: ltrace > tar > xz) sera lancé par tar quand il soit nécessaire. En tant que tel, nous devons tracer les processus enfants du programme exécuté sous ltrace, en d'autres termes tar. Nous pouvons le faire en spécifiant ce qui suit (-f) option une ltrace:

ltrace de goudron suivi (-F) pour tracer les processus enfants

ltrace -f tar -hcf --xz archive.tar.xz *

A noter qu'il est indispensable de préciser le -f option directement derrière ltrace et pas plus tard sur la ligne de commande après tar par exemple. La raison est que nous voulons spécifier cette option pour ltrace et non à tar commander. Toutes les alternatives après tar commande sont tar des options spécifiques tout en -f est une alternative spécifique pour ltrace.

Le résultat est un peu plus intéressant. Nous n'avons toujours pas vu d'appels à la bibliothèque (certainement pas), mais au moins on voit que deux fils sont fourchus (Remarque exec()) et que les deux threads se terminent par status 0. Pratique et tout bon.

Ensuite, Où sont nos appels à la bibliothèque? Vérification tar Oui xz (les deux programmes que la commande utilisera pour créer le fichier archive) avec ldd, on se rend vite compte que la plupart des bibliothèques utilisées par les deux programmes sont des bibliothèques système:

En savoir plus sur les bibliothèques utilisées par tar et xz à l'aide de la commande ldd

whereis tar
whereis xz
ldd /bin/tar
ldd /usr/bin/xz

C'est à cause de ça, debemos ir un paso más allá y habilitar el seguimiento de las llamadas a la biblioteca del sistema especificando el -S option une ltrace. Esta opción se encuentra deshabilitada / apagada de forma predeterminada, dado que la salida se volvería un poco detallada, y es probable que se asuma que las bibliotecas del sistema son de forma general mucho más estables y, En tant que tel, no es necesario rastrearlas para comenzar. Nous allons jeter un coup d'oeil.

ltrace -fS tar -hcf --xz archive.tar.xz * 

O, con fines de prueba:

ltrace -S nos permite ver las llamadas al sistema también

ltrace -fS tar -hcf --xz archive.tar.xz * 2>&1 | head -n10
ltrace -fS tar -hcf --xz archive.tar.xz * 2>&1 | tail -n10

Como el resultado fue sustancial, nous avons dû capturer les dix premières et dernières lignes à l'aide d'un head Oui tail commander. Pour utiliser ces commandes, nous avons dû rediriger stderr pour stdout en utilisant le 2>&1 rediriger comme ltrace rapportera par défaut sur stderr. Si vous souhaitez en savoir plus sur la redirection, consultez les bases de l'automatisation et des scripts Bash (Partie 3).

Maintenant que nous ajoutons le -S option, nous pouvons voir toutes les bibliothèques auxquelles on accède. Par exemple, nous voyons /etc/ld.so.preload en cours d'accès. La sortie est séquentielle (de haut en bas), donc s'il y a d'autres événements (fil de branchement, etc.) au milieu, ceux-ci seront affichés en ligne au moment où ils auront lieu. En même temps, nous pourrions ajouter le -t option pour la sortie basée sur le temps:

ltrace -t nous permet de voir la sortie temporisée

Fin

Dans cet article, nous présentons et discutons de la polyvalence ltrace programme, qui est un excellent outil qui permet de suivre tous les appels de bibliothèque dynamiques qu'un programme donné fait. nous avons installé ltrace, mis en place un environnement de test et exécuté quelques ltrace comandos con las alternativas más utilizadas.

Abonnez-vous à notre newsletter

Nous ne vous enverrons pas de courrier SPAM. Nous le détestons autant que vous.