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 “Nsin un eseguibile chiamato 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 less
funzionalità 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.