Ê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
, et 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
(et, 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
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
et 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
et 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:
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 -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
et 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:
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 -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
et 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:
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.