I programmi Linux chiedono il
kernel
fare alcune cose per loro. Il
strace
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
Smart come potrebbero essere, i programmi per computer non possono fare tutto per se stessi. Devono effettuare richieste di avere determinate funzioni eseguite per loro. Queste richieste vanno al kernel Linux. In genere, c'è una biblioteca o un'altra interfaccia software che il programma chiama e la biblioteca fa quindi la richiesta appropriata, chiamata chiamata di sistema, al kernel.
Essere in grado di vedere il sistema chiama che un programma ha effettuato e quali sono state le risposte possono aiutarti a comprendere il funzionamento interno dei programmi che ti interessano o che hai scritto. Questo è
che cosa
strace
fa
. Può aiutare a risolvere i problemi e cercare colli di bottiglia.
Questo non è lo stesso di
Debug di una domanda
con uno strumento come
Gdb.
. Un programma di debug consente di indagare sull'operazione interna di un programma come funziona. Ti consente di passare attraverso la logica del programma e ispezionare la memoria e i valori variabili. In confronto, cosa
strace
Fa catturare le informazioni di chiamata del sistema in quanto il programma è in esecuzione. Quando il programma tracciato termina,
strace
Elenca le informazioni di chiamata del sistema alla finestra del terminale.
Le chiamate di sistema forniscono tutti i tipi di funzionalità di basso livello, come le azioni di lettura e scrittura su file, processi di uccisione e così via. C'è un elenco di centinaia di chiamate di sistema sul Pagina uomo Syscalls. .
IMPARENTATO: Debug con GDB: Inizia
Installazione di Strace.
Se
strace
Non è già installato sul tuo computer, è possibile installarlo molto facilmente.
Su Ubuntu, usa questo comando:
Sudo Apt Install Strace
Su Fedora, digita questo comando:
Sudo DNF Installa Strace
Su Manjaro, il comando è:
Sudo Pacman -sy Strace
Primi passi con strace
Useremo un piccolo programma per dimostrare
strace
. Non fa molto: apre un file e scrive una linea di testo ad esso, e non ha alcun errore di controllo. È solo un rapido hack in modo da avere qualcosa con cui usare
strace
.
#include & lt; stdio.h & gt;
int principale (int Argc, char argv []) {
// Maniglia dei file
File * FileGeek;
// Apri un file chiamato "strace_demo.txt" o crearlo
FileGeek = fopen ("strace_demo.txt", "w");
// scrivi un po 'di testo nel file
FPRINTF (FileGeek, "Scrivi questo al file");
// Chiudi il file
fClose (FileGeek);
// uscita dal programma
ritorno (0);
} // Fine del principale
Abbiamo salvato questo in un file chiamato "file-io.c" e lo ha compilato con
GCC.
in un eseguibile chiamato
stex.
, chiamato per "
ns
corsa
ex
ampio."
GCC -O STEX FILE-IO.C
Chiameremo
strace
Dalla riga di comando e passare il nome del nostro nuovo eseguibile ad esso come il processo che vogliamo essere tracciato. Potremmo semplicemente rintracciare tutti i comandi Linux o qualsiasi altro eseguibile binario. Stiamo usando il nostro minuscolo programma per due motivi.
Il primo motivo è quello
strace
è verboso. Ci può essere un sacco di output. È fantastico quando stai usando
strace
in rabbia, ma può essere travolgente all'inizio. C'è limitato
strace
Uscita 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ù facile identificare quali sezioni dell'output si riferiscono alle diverse parti dei lavori interni del programma.
Strace ./stex
Possiamo vedere chiaramente il
Scrivi
Chiamata di sistema Inviamento del testo "Scrivi questo al file" al nostro file aperto e al
exit_group.
chiamata di sistema. Questo termina tutti i thread nell'applicazione e invia un valore di ritorno alla shell.
Filtrando l'uscita
Anche con il nostro semplice programma dimostrativo, c'è un sacco di output. Possiamo usare il
-e.
opzione (espressione). Passeremo nel nome della chiamata di sistema che vogliamo vedere.
Strace -e scrivere ./stex
È possibile riportare su più chiamate di sistema aggiungendole come elenco separato da virgole. Non includere alcuna spazi bianca nell'elenco delle chiamate di sistema.
Strace -e chiudi, scrivi ./stex
Invio dell'output a un file
Il vantaggio del filtraggio dell'output è anche il problema con il filtraggio dell'output. Vedi cosa hai chiesto di vedere, ma non vedi nient'altro. E alcuni di quelle altre output potrebbero essere più utili a te delle cose che hai chiesto di vedere.
A volte, è più conveniente catturare tutto e cercare e scorrere l'intero insieme dei risultati. In questo modo, non escluderai accidentalmente nulla di importante. Il
-o
(output) L'opzione consente di inviare l'uscita da a
strace
sessione a un file di testo.
Strace -o Trace-output.txt ./stex
Puoi allora
utilizzare il
meno
comando
Per scorrere la quotazione e cercare chiamate di sistema, o qualsiasi altra cosa, per nome.
Meno traccia-output.txt
Ora puoi usare tutto
meno
'S Capacità di ricerca per indagare sull'output.
IMPARENTATO: Come utilizzare il comando Meno su Linux
Aggiungere timestamps.
È possibile aggiungere diversi timestamps all'uscita. Il
-R
(Timestamps relativi) L'opzione aggiunge timestamps che mostrano la differenza di tempo tra l'avvio di ogni chiamata di sistema successiva. Si noti che questi valori del tempo includeranno il tempo trascorso nella precedente chiamata di sistema e qualsiasi altra cosa che il programma stava facendo prima della prossima chiamata di sistema.
Strace -r ./stex
I timestamp sono visualizzati all'inizio di ciascuna riga di uscita.
Per vedere la quantità di tempo trascorso in ogni chiamata di sistema, usa il
-T
Opzione (Syscall-Times). Questo mostra la durata del tempo trascorso all'interno di ogni chiamata di sistema.
Strace -t ./stex
Le durate del tempo sono mostrate alla fine di ciascuna linea di chiamata di sistema.
Per vedere il tempo in cui è stata chiamata ogni chiamata di sistema, usa il
-T.
(timestamps assoluti) opzione. Questo mostra il tempo "orologio da parete", con una risoluzione di microsecond.
Strace -TT ./stex
I tempi vengono visualizzati all'inizio di ogni riga.
Tracciare un processo di esecuzione
Se il processo che si desidera tracciare è già in esecuzione, è ancora possibile allegare
strace
ad esso. Per fare ciò, è necessario conoscere l'ID del processo. Puoi
utilizzo
Ps.
insieme a
grep.
Per trovarlo. Abbiamo Firefox in esecuzione. Per scoprire l'ID del
firefox.
processo, possiamo usare
Ps.
e
tubata attraverso
grep.
.
PS -E | GREP Firefox
Possiamo vedere che l'ID del processo è 8483. Useremo il
-P
(ID processo) Opzione da raccontare
strace
quale processo si attacca a. Si noti che dovrai usare
sudo.
:
Sudo Strace -P 8483
Vedrai una notifica che
strace
Si è collegato al processo, e quindi le chiamate di traccia del sistema verranno visualizzate nella finestra del terminale come al solito.
Creando un report.
Il
-C
(Solo sommario) Cause opzionali
strace
per stampare un rapporto. Genera una tabella per informazioni sulle chiamate di sistema effettuate dal programma TRACCED.
Strace -C ./stex
Le colonne sono:
- % tempo : La percentuale del tempo di esecuzione trascorso in ciascuna chiamata di sistema.
- secondi : Il tempo totale espresso in secondi e microsecondi trascorsi in ciascuna chiamata di sistema.
- USECS / CALL. : Il tempo medio in microsecondi ha speso in ogni chiamata di sistema.
- chiamate : Il numero di volte in cui ogni chiamata di sistema è stata eseguita.
- errori : Il numero di guasti per ogni chiamata di sistema.
- syscall. : Il nome della chiamata di sistema.
Questi valori mostreranno Zeros per programmi banale che eseguono e terminano rapidamente. I valori del mondo reale sono mostrati per programmi che fanno qualcosa di più significativo della nostra applicazione dimostrativa.
Profonde approfondimenti, facilmente
Il
strace
L'output può mostrare quali vengono apportate le chiamate di sistema, quali vengono apportati ripetutamente e quanto tempo di esecuzione viene speso all'interno del codice del kernel. Sono grandi informazioni. Spesso, quando stai cercando di capire cosa sta succedendo all'interno del tuo codice, è facile dimenticare che il tuo binario sta interagendo quasi senza sosta con il kernel per eseguire molte delle sue funzioni.
Usando
strace
, vedi l'immagine completa.