Cómo utilizar ltrace para rastrear llamadas a la biblioteca

Contenuti

Bash Shell

¿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

Instalando ltrace en la línea de comando con apt

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:

La nostra prima traccia di catrame

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 of tar con follow (-F) per tracciare i processi figlio

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:

Scoprire di più sulle librerie usate da tar e xz usando il comando ldd

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 -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, 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:

ltrace -t ci permette di vedere l'output temporizzato

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.

Iscriviti alla nostra Newsletter

Non ti invieremo posta SPAM. Lo odiamo quanto te.