¿Está interesado en corregir esos errores de biblioteca y errores que observa al instalar un programa nuevo y genial en Linux? Consulte este artículo que muestra cómo utilizar ltrace y le proporciona la herramienta necesaria para depurar las llamadas a la biblioteca.
Che cos'è un? Biblioteca?
La mayoría de la gente está familiarizada con .dll/.DLL
record (bibliotecas de vínculos dinámicos) in Windows. El idéntico de Linux es un .so
file, un oggetto condiviso, spesso indicato semplicemente come una biblioteca.
Una libreria può essere utilizzata da un'applicazione che consente a quel programma di utilizzare funzionalità esterne al suo codice di programma.. Come esempio, un server web potrebbe voler utilizzare una libreria di E / Disco S scritto dal fornitore del sistema operativo o da un'altra terza parte. È un modo di condividere i beni comuni e gli interessi della maggioranza, se non del tutto, sistemi operativi.
Le librerie possono essere caricate dinamicamente in fase di esecuzione (all'avvio del programma chiamante, come esempio) oppure possono essere compilati in un'applicazione di destinazione / binario. È per questo, caricherà sempre (se sono usati o no), come parte e fintanto che l'applicazione che li ha compilati viene avviata / integrato.
Per maggiori informazioni sulle biblioteche, le sue dipendenze e ldd
attrezzo, potresti voler leggere su come lavorare con le dipendenze degli oggetti condivisi in Linux. il ldd
è un altro strumento utile da avere in qualsiasi toolbox utente Linux più avanzato.
Che cos'è disegno?
Ci sono diverse utilità di traccia in Linux, come strace per tenere traccia delle chiamate e dei segnali di sistema e del traceroute
per tracciare il routing di rete. il ltrace
Utilità / lo strumento tiene traccia di tutte le chiamate della libreria.
Se hai letto il nostro lavoro con le dipendenze degli oggetti condivisi (biblioteca) nell'articolo su Linux (linkato sopra), Hai già visto come puoi scoprire a quali librerie è vincolato un particolare binario usando il ldd
attrezzo. Lo scopo e la funzionalità di ltrace
è qualcosa di diverso; molto in linea con strace
, il ltrace
Il comando tiene traccia di tutte le chiamate alla libreria che un particolare programma effettua durante l'esecuzione.
Uguale a strace
, possiamo avviare un programma sotto (pensala come una gerarchia) ltrace
. Specifichiamo semplicemente il programma che ltrace
dovrebbe iniziare come prima scelta per ltrace
, e ltrace
avvierà quel programma per noi e inizierà immediatamente (a un livello superiore) per tenere traccia di tutte le chiamate a qualsiasi libreria (sistema operativo o installato da terze parti).
Lo fa intercettando e registrando il dinamico chiamate alla libreria effettuate dal programma in esecuzione. Allo stesso tempo, terrà traccia di qualsiasi segnale inviato al programma in esecuzione, molto identico a strace
(e, se desideri, questa funzionalità può essere disabilitata specificando il -b
o identico --no-signals
opzione a ltrace
).
Nota che il termine dinamico è di grande importanza qui; ltrace
traccerà le chiamate a esterno biblioteche (nella forma di .so
oh .a
record), in altre parole, bibliotecas no compiladas de forma directa en un programa; dinamico Bibliotecas. È per questo, si tiene un binario con bibliotecas estáticamente (compiladas), ltrace
no podrá ver / rastrear dichas llamadas internas.
installazione disegno
Installare disegno sulla tua distribuzione Linux basata su Debian / apt (come Ubuntu e Mint), esegui il seguente comando nel tuo terminale:
sudo apt install ltrace
Installare disegno sulla tua distribuzione Linux basata su RedHat / Yum (come RHEL, Centos e Fedora), esegui il seguente comando nel tuo terminale:
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
e xz
instalando xz-utils
(puedes usar sudo yum install tar xz
Invece, si está usando Centos / RHEL / Fedora). A continuación creamos un directorio ~/workspace
y saltó a él. Posteriormente hicimos tres archivos vacíos usando el touch
comando, vale a dire, record a
, b
e c
.
Iniziamo comprimendo i nostri tre file in uno (catrame combinato e xz compresso) archive.tar.xz
file, suonando lo stesso basso ltrace
, e osservando il ltrace
produzione:
ltrace tar -hcf --xz archivio.tar.xz *
Vediamo solo una piccola quantità di output. Possiamo vedere che il nostro programma è terminato con successo (file di archivio è stato creato), in altre parole, status 0
: un codice di uscita di 0
significa sempre successo su Linux (anche se il programma deve avere i codici di uscita implementati correttamente).
Questo non è molto utile finora. Motivo per pochi secondi su come tar
opererà qui rivelerà rapidamente il nostro prossimo approccio. L'avido lettore può allo stesso tempo aver capito che il tar
Il comando chiamerà internamente il xz
comando. il --xz
opzione passata al nostro tar
la riga di comando assicurerà che il xz
Il programma viene utilizzato per la compressione.
La procedura secondaria (o il terzo nella gerarchia generale) in altre parole xz
(gerarchia: ltrace
> tar
> xz
) sarà avviato da tar
quando necessario. Come tale, dobbiamo tracciare i processi figli del programma in esecuzione sotto ltrace
, in altre parole tar
. Possiamo farlo specificando quanto segue (-f
) opzione a ltrace
:
ltrace -f tar -hcf --xz archivio.tar.xz *
Si noti che è essenziale specificare il -f
opzione direttamente dietro ltrace
e non più tardi sulla riga di comando dopo tar
come esempio. Il motivo è che vogliamo specificare questa opzione per ltrace
e non per tar
comando. Tutte le alternative dopo tar
comando sono tar
opzioni specifiche mentre -f
è un'alternativa specifica per ltrace
.
Il risultato è un po' più interessante. Non abbiamo ancora visto nessuna chiamata in biblioteca (non c'è modo), ma almeno vediamo che due fili si biforcano (Nota exec()
) e che entrambi i thread finiscono con status 0
. Pratico e tutto buono.
Quindi, Dove sono le chiamate della nostra biblioteca? Verifica tar
e xz
(i due programmi che il comando utilizzerà per creare il file di archivio) insieme a ldd
, ci rendiamo subito conto che la maggior parte delle librerie utilizzate da entrambi i programmi sono librerie di sistema:
whereis tar
whereis xz
ldd /bin/tar
ldd /usr/bin/xz
È per questo, debemos ir un paso más allá y habilitar el seguimiento de las llamadas a la biblioteca del sistema especificando el -S
opzione a 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, come tale, no es necesario rastrearlas para comenzar. Diamo un'occhiata.
ltrace -fS tar -hcf --xz archive.tar.xz *
oh, 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, tuvimos que capturar la primera y las últimas diez líneas usando un head
e tail
comando. Para poder usar estos comandos tuvimos que redirigir stderr
per stdout
usando il 2>&1
redirección como ltrace
informará de forma predeterminada sobre stderr
. Si está interesado en obtener más información sobre la redirección, consulte Bash Automation and Scripting Basics (Parte 3).
Ahora que agregamos el -S
opzione, possiamo vedere tutte le librerie a cui si accede. Come esempio, vediamo /etc/ld.so.preload
essere acceduto. L'uscita è sequenziale (da cima a fondo), quindi se ci sono altri eventi (filo ramificato, eccetera.) nel mezzo, questi verranno visualizzati online nel momento in cui si svolgono. Allo stesso tempo potremmo aggiungere il -t
opzione per output basato sul tempo:
Fine
In questo articolo, presentiamo e discutiamo il versatile ltrace
programma, que es una gran herramienta que posibilita rastrear todas las llamadas de biblioteca dinámicas que hace un programa dado. Nosotros instalamos ltrace
, configuró un entorno de prueba y ejecutó algunos ltrace
comandos con las alternativas más utilizadas.