Come usare strace per monitorare le chiamate di sistema Linux

Contenuti

Una finestra terminale stilizzata su un laptop.

I programmi Linux chiedono al kernel di fare alcune cose per loro. il strace Il comando rivela queste chiamate di sistema. Puoi usarli per capire come funzionano i programmi e perché, A volte, Non lo fanno.

Il kernel e le chiamate di sistema

Non importa quanto siano intelligenti, i programmi per computer non possono fare tutto da soli. Devono fare richieste per l'esecuzione di determinate funzioni. Queste richieste vanno al kernel Linux. Generalmente, c'è una libreria o un'altra interfaccia software che il programma chiama, e poi la biblioteca fa l'apposita richiesta, chiama chiamata di sistema, al kernel.

Essere in grado di vedere le chiamate di sistema effettuate da un programma e quali sono state le risposte può aiutarti a comprendere il funzionamento interno dei programmi che ti interessano o che hai scritto.. Questo è Quello strace lo fa?. Può aiutare a risolvere problemi e trovare colli di bottiglia.

Questo non è lo stesso di eseguire il debug di un'applicazione con uno strumento come gdb . Un programma di debug ti consente di indagare sul funzionamento interno di un programma mentre è in esecuzione. Consente di esplorare la logica del programma e di ispezionare la memoria e i valori delle variabili. Rispetto, Quello strace quello che fa è catturare le informazioni della chiamata di sistema mentre il programma è in esecuzione. Al termine del programma monitorato, strace elenca le informazioni sulla chiamata di sistema nella finestra del terminale.

Le chiamate di sistema forniscono tutti i tipi di funzioni di basso livello, come azioni di lettura e scrittura sui file, eliminazione del processo, eccetera. C'è un elenco di centinaia di chiamate di sistema nel pagina di manuale di syscalls.

IMPARENTATO: Debug con GDB: introduzione

installazione di strace

e strace non è ancora installato sul tuo computer, puoi installarlo molto facilmente.

In Ubuntu, usa questo comando:

sudo apt install strace

In Fedora, scrivi questo comando:

sudo dnf install strace

A Manjaro, il comando è:

sudo pacman -Sy strace

Iniziare con strace

Useremo un piccolo programma per dimostrare strace. Non molto tempo fa: apri un file e scrivici una riga di testo, e non ha alcun errore durante il controllo. È solo un trucco veloce, quindi abbiamo qualcosa da usare strace.

#includere <stdio.h>

int main(int argomento, carattere argv[]) { 

  // file handle 
  FILE *fileGeek;

  // aprire un file chiamato "strace_demo.txt", or create it 
  fileGeek = fopen("strace_demo.txt", "w");

  // write some text to the file 
  fprintf(fileGeek, "Scrivi questo nel file" );

  // close the file 
  fclose(fileGeek);

  // exit from program 
  return (0); 

} // fine principale

Salviamo questo in un file chiamato “file-io.c” e compilalo con gcc in un eseguibile chiamato stex, in un eseguibile chiamato “Nscorsa in un eseguibile chiamatoin un eseguibile chiamato”

in un eseguibile chiamato

in un eseguibile chiamato strace in un eseguibile chiamato. Potremmo facilmente rintracciare qualsiasi comando di Linux o qualsiasi altro eseguibile binario. Usiamo il nostro programmino per due motivi.

La prima ragione è che strace è verboso. Ci possono essere molti risultati. È fantastico quando lo usi strace incazzato, ma all'inizio può essere travolgente. Ci sono limitati strace partenza per il nostro piccolo programma. La seconda ragione è che il nostro programma ha funzionalità limitate e il codice sorgente è breve e semplice.. Ciò rende più semplice identificare quali sezioni dell'output si riferiscono a parti diverse del funzionamento interno del programma..

strace ./stex

Possiamo vedere chiaramente il write in un eseguibile chiamato “in un eseguibile chiamato” in un eseguibile chiamato exit_group chiamata di sistema. Questo termina tutti i thread nell'applicazione e invia un valore di ritorno alla shell.

Filtra l'output

Anche con il nostro semplice programma demo, c'è abbastanza via d'uscita. Possiamo usare il -e Opzione (espressione). Passeremo il nome della chiamata di sistema che vogliamo vedere.

strace -e scrivi ./stex

Puoi segnalare più chiamate di sistema aggiungendole come elenco separato da virgole. Non includere spazi bianchi nell'elenco delle chiamate di sistema.

strace -e chiudi,scrivi ./stex

Invia l'output a un file

Il vantaggio di filtrare l'output è anche il problema del filtraggio dell'output. Vedi quello che hai chiesto di vedere, ma non vedi altro. E alcuni di questi altri risultati potrebbero esserti più utili delle cose che hai chiesto di vedere..

Qualche volta, è più comodo catturare tutto e cercare e scorrere l'intero set di risultati. Quel modo, non escluderà accidentalmente nulla di importante. il -o L'opzione (Uscita) consente di inviare l'output da a strace sessione in un file di testo.

strace -o trace-output.txt ./stex

Prossimo, puoi usare il less comando per scorrere l'elenco e trovare le chiamate di sistema, o qualsiasi altra cosa, per nome.

less trace-output.txt

Ora puoi usare tutto lessfunzionalità di ricerca per indagare sull'uscita.

IMPARENTATO: Come usare il comando less in Linux

Aggiungi timestamp

Puoi aggiungere diversi timestamp all'output. il -r L'opzione (timestamp relativi) aggiunge timestamp che mostrano la differenza di tempo tra l'inizio di ogni successiva chiamata di sistema. Nota che questi valori di tempo includeranno il tempo trascorso nella chiamata di sistema precedente e qualsiasi altra cosa stesse facendo il programma prima della successiva chiamata di sistema..

strace -r ./stex

I timestamp vengono visualizzati all'inizio di ogni linea di partenza.

Per vedere la quantità di tempo speso per ogni chiamata di sistema, usa el -T (syscall-times) opzione. Questo mostra il tempo trascorso all'interno di ogni chiamata di sistema.

strace -T ./stex

Le durate vengono visualizzate alla fine di ogni comparsa di chiamata di sistema.

Per vedere l'ora in cui è stata chiamata ogni chiamata di sistema, Utilizzare il -tt (timestamp assoluti). in un eseguibile chiamato “in un eseguibile chiamato”, con risoluzione in microsecondi.

strace -tt ./stex

Gli orari sono indicati all'inizio di ogni riga.

Follow-up di una procedura in corso

Se la procedura che vuoi tracciare è già in esecuzione, può ancora allegare strace esso. Per farlo, devi conoscere l'id della procedura. Puoi usare ps insieme a grep per trovare questo. Abbiamo Firefox in esecuzione. Per scoprire l'ID del firefox processi, possiamo usare ps e incanalalo attraverso grep.

ps -e | grep firefox

Possiamo vedere che l'ID della procedura è 8483. Useremo il -p (ID procedura) possibilità di dire strace a quale procedura allegare. Si prega di notare che sarà necessario utilizzare sudo :

sudo strace -p 8483

Vedrai una notifica che strace è stato allegato alla procedura, e quindi le chiamate di traccia del sistema verranno visualizzate nella finestra del terminale come al solito.

Crea un rapporto

il -c (solo riassunto) cause di opzione strace stampare un rapporto. Genera una tabella per ottenere informazioni sulle chiamate di sistema effettuate dal programma tracciato.

strace -c ./stex

Le colonne sono:

  • % tempo metereologico: La percentuale di tempo di esecuzione che è stata spesa per ogni chiamata di sistema.
  • secondi: Il tempo totale in secondi e microsecondi per ogni chiamata di sistema.
  • usi / chiamata: Il tempo medio in microsecondi speso per ogni chiamata di sistema.
  • chiama: Il numero di volte in cui ogni chiamata di sistema è stata eseguita.
  • errori: Il numero di errori per ogni chiamata di sistema.
  • syscall: Il nome della chiamata di sistema.

Questi valori mostreranno zeri per i programmi banali che vengono eseguiti e terminano rapidamente. I valori del mondo reale vengono visualizzati per i programmi che fanno qualcosa di più significativo della nostra applicazione demo.

Intuizioni profonde, facilmente

il strace L'output può mostrarti quali chiamate di sistema vengono effettuate, quali vengono eseguiti ripetutamente e quanto tempo di esecuzione viene speso all'interno del codice lato kernel. È un'ottima informazione. Spesso, quando cerchi di capire cosa sta succedendo all'interno del tuo codice, è facile dimenticare che il tuo binario interagisce quasi ininterrottamente con il kernel per eseguire molte delle sue funzioni.

Attraverso l'uso strace, vedi l'intera immagine.

Iscriviti alla nostra Newsletter

Non ti invieremo posta SPAM. Lo odiamo quanto te.