Come utilizzare strace per tracciare chiamate e segnali di sistema

Contenuti

Bash Shell

Rintracciare un programma per computer non è riservato solo a chi possiede il codice sorgente, possono leggerlo e sapere come usare un debugger. Qualsiasi utente Linux può tracciare un eseguibile con strace. Scopri come!

Che cos'è strace?

strace è un'utilità Linux che consente di tracciare le chiamate di sistema effettuate da una determinata applicazione. Catturerà anche i segnali e produrrà un output dettagliato di tutte le informazioni che osserva..

Una nuova persona per gattonare e gattonare, generalmente, potresti chiedere perché questo è utile. Un ingegnere IT professionista potrebbe chiedere quante informazioni Strace può veramente acquisire, soprattutto se sai quante informazioni può vedere un debugger come GDB.

Se sei interessato al debug di codici e programmi per computer, vedere il nostro post Debug con GDB: introduzione.

Ci sono buone notizie in entrambi i casi! Il monitoraggio di tutte le chiamate e i segnali di sistema fornisce un quadro completo del funzionamento di un programma, ed è un ottimo strumento di risoluzione dei problemi e persino di debug. Allo stesso tempo, funziona per tutto il runtime (come procedura di avvolgimento), ma può essere facilmente rintracciato in un file di registro e offre una panoramica facile da digerire delle azioni di un programma.

Confrontandolo con GDB, che è anche una procedura di avvolgimento, le cose sono sostanzialmente diverse. Come esempio, e GDB, si potrebbe tracciare un programma passo dopo passo (come esempio, una riga di codice alla volta o un blocco logico di codice, o usando punti di interruzione nel codice). Nonostante questo, questi passaggi vengono eseguiti durante tempo di esecuzione, mentre strace esegue semplicemente il programma nel suo insieme fino a quando non si verifica un errore o fino al completamento.

L'ingegnere o l'utente può andare ad analizzare l'intero record (basato su testo), cerca corde interessanti, eccetera. Allo stesso tempo, GDB permetterebbe di vedere anche segnali e chiamate al sistema, anche se configurarlo e analizzarlo è molto più complesso che con strace.

Con strace, puoi semplicemente eseguire il programma in strace (In altre parole strace some_program), e anche se questo è più o meno lo stesso di GDB, l'operazione differisce in modo significativo, come precedentemente descritto.

Per quanto riguarda la quantità di informazioni che possono essere viste in una traccia, è bene fare un passo indietro e ricordare da dove viene la maggior parte dei problemi del computer: Disco pieno, memoria esaurita, nessun file trovato, inserimento sbagliato, eccetera.

Soprattutto nelle aree di accesso al disco, strace brilla davvero. Come registra tutte le chiamate di sistema, ogni accesso al disco è altamente visibile nel registro. Ancora, può cercare stringhe di testo e nomi di file rilevanti, anche se tieni presente che, A volte, le catene possono essere ridotte in lunghezza, in modo che sia visibile solo l'output parziale.

In sintesi, se dovessimo qualificarci strace come strumento di debug e / o risoluzione dei problemi e assegnargli un posto in una cassetta degli attrezzi per utenti Linux più nuova o più abile, poi, in entrambi i casi, la soluzione è più o meno nel mezzo, anche se tende più alla risoluzione dei problemi che al debug. Installiamo strace Prossimo.

IMPARENTATO: Come funzionano le porte logiche: O, E, XOR, NÉ, NAND, XNOR e NON

installazione strace

Installare strace sulla tua distribuzione Linux basata su Debian / apt (come Ubuntu e Mint), esegui il seguente comando nel tuo terminale:

sudo apt install strace

Installare strace sulla tua distribuzione Linux basata su RedHat / Yum (come RHEL, Centos e Fedora), esegui il seguente comando nel tuo terminale:

sudo yum install strace

Usando strace

Dopo l'installazione strace, è abbastanza facile iniziare. Noi possiamo, come esempio, traccia linux sleep comando / utilità:

sonno strace 1

traccia di un secondo processo onirico

Subito, il risultato conferma l'affermazione di cui sopra. C'è una ricchezza di informazioni su tutte le azioni intraprese dal (molto) semplice sleep 1 comando, Quello, Dopotutto, solo azioni che dormono per un solo secondo.

Diamo un'occhiata ad alcune cose che possiamo osservare subito:

accesso("/etc/ld.so.preload", R_OK)      = -1 ENOENT (Nessun file o directory con questo nome)

Lo vediamo poco dopo l'avvio, il programma ha provato ad entrare (Sul disco) archiviare /etc/ld.so.preload. Possiamo anche vedere che questo non è riuscito (-1 status), poiché il file non è stato trovato (ENOENT) con messaggio di errore descrittivo No such file or directory.

Solo questa singola linea di partenza potrebbe portare a ulteriori indagini. Come esempio, possiamo scansionare il nostro motore di ricerca preferito cercando quale sia il file /etc/ld.so.preload è / fa e cosa succede quando un programma non riesce a trovarlo, così come possiamo installarlo.

Come potete vedere, se ho eseguito un software / programma più complesso in strace, è possibile che scopra che sta cercando di entrare in un file, come esempio, un file condiviso .so libreria e non la trovo. Facilmente analizzabile e probabilmente facilmente risolvibile grazie a strace.

Prossimo, vediamo il conf.d cache binaria che si apre correttamente come sola lettura (O_RDONLY), con il flag close-on-exec (utilizzato in programmi multithread per evitare race condition) O_CLOEXEC set di bandiere:

Aprire(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3

Anche se non sai cosa significa ogni elemento, una semplice ricerca online fornirà rapidamente informazioni su ogni termine o parola specifica, che ti aiuterà a capire le informazioni presentate e cosa sta succedendo.

Di particolare interesse è anche questa linea verso la fine:

+++ uscito con 0 +++

Ciò indica che il programma è terminato correttamente con il codice di uscita. 0. Un codice di uscita di 0 indica generalmente l'esecuzione e la terminazione di programmi Linux con successo.

Come puoi vedere dagli esempi sopra, è facile vedere cosa fa un programma usando strace. Puoi analizzare ogni riga e anche ogni parola in ogni riga e, spesso, ci vuole un motore di ricerca per far luce. Nonostante questo, anche dare un'occhiata all'output di un programma in crash potrebbe essere sufficiente per trovare la causa esatta e risolverla., e soprattutto quando, come esempio, manca un file richiesto, eccetera.

IMPARENTATO: In che modo i runlevel Linux influiscono sui servizi in esecuzione

Monitoraggio del processo secondario

Quando usi strace, a volte sembrerà che strace non tiene traccia correttamente di tutte le chiamate di sistema dal programma, eccetera. Questo potrebbe essere semplicemente dovuto al fatto che il programma che viene tracciato è stato avviato / avviato diversi processi figlio, come esempio, quando si ramificano processi figlio.

È semplice includere questi processi figlio nell'acquisizione di strace: basta aggiungere il -f opzione della riga di comando (In altre parole, strace -f your_program), e anche tutte le chiamate al sistema verranno tracciate, eccetera., di tutti i processi figlio.

Fine

In questo post, abbiamo discusso di strace attrezzo, che può essere utilizzato per tenere traccia di qualsiasi programma o applicazione in esecuzione su un computer basato su Linux.

Dopo aver installato lo strumento, possiamo avviare il programma in modo semplice e diretto sotto strace e goditi l'alto livello di informazioni sulla risoluzione dei problemi e il debug che strace wrapper ci presenterà.

Iscriviti alla nostra Newsletter

Non ti invieremo posta SPAM. Lo odiamo quanto te.