Come tenere traccia dell’esecuzione del programma utilizzando il comando strace di Linux
La maggior parte delle volte, quando i programmatori e gli amministratori di sistema tentano di eseguire il debug o di risolvere i problemi con i loro binari e pacchetti compilati, a un certo punto incontrerai errori, arresti anomali del programma e stato di uscita che senza dubbio distruggeranno il cervello se puoi. Non riesco a trovare la causa del problema.
In questo tutorial, apprendiamo il comando strace in Linux con esempi di utilizzo.
Il comando strace Linux
Strace è uno strumento diagnostico e di debug nei sistemi Linux che viene utilizzato per registrare e intercettare i nomi delle chiamate di sistema chiamate da un processo in esecuzione e i segnali che vengono ricevuti da detto processo in esecuzione. Può anche diventare un utile strumento di isolamento dei bug.
Strace come potente strumento viene utilizzato principalmente per la risoluzione dei problemi, il debug e l’analisi di come un’applicazione, un programma o un binario interagisce con il tuo sistema Linux. Quindi, se hai problemi con il tuo programma o binario compilato, puoi usare strace per verificare dove viene rilevato il problema e quale specifica chiamata di sistema è mirata.
Il comando strace può essere utilizzato anche da utenti non root nel suo utilizzo di base. Questa versatilità ti dà la possibilità nello spazio utente di controllare eseguibili non privilegiati che devono solo essere rivisti senza influire sulle modifiche a livello di sistema.
Sintassi:
strace [-ACdffhikqqrtttTvVwxxyyzZ] [-I n] [-b execve]
[-e expr]... [-O overhead] [-S sortby] [-U columns]
[-a column] [-o file] [-s strsize] [-X format]
[-P path]... [-p pid]... [--seccomp-bpf] { -p pid | [-DDD]
[-E var[=val]]... [-u username] command [args] }
Installazione
Nelle distribuzioni Linux più recenti, strace è già preinstallato. Tuttavia, se scopri che non è stato ancora installato, puoi eseguire i seguenti comandi in base alle tue distribuzioni Linux:
Per Debian/Ubuntu
sudo apt install strace
Per Federa
sudo dnf install strace
Per Cappello Rosso / Flusso CentOS
sudo yum install strace
Per ArcoLinux
sudo pacman install strace
opzioni del comando strace
Alcune utili opzioni del comando strace:
scelta | Descrizione |
---|---|
-UN | COLONNA di allineamento per la stampa dei risultati delle chiamate di sistema (predefinito 40) |
– c | Contare il tempo, le chiamate e gli errori per ogni chiamata di sistema e il riepilogo del report |
-C | come -c, ma stampa anche un normale output |
d | abilita l’output di debug all’errore standard (stderr) |
d | eseguire il processo di tracciamento come nipote distaccato, non come genitore |
Opzioni -e expr: | un’espressione qualificante: option=[!]tutto o opzione=[!]onda1[,val2]…trace, abbrev, verbose, raw, signal symbol, read, write, error, inject, kvm, desc (file descriptor) |
– f | Segui le forchette |
-ff | seguire i fork con l’output in file separati |
loro | stampa il puntatore all’istruzione al momento della chiamata di sistema |
-IO | Interruttori |
-un |
invia l’output della traccia a FILE invece dell’errore standard (stderr) |
t | stampare il timestamp in assoluto |
T | il tempo di stampa impiegato in ciascuna chiamata di sistema |
-w | riepiloga la latenza delle chiamate di sistema (l’impostazione predefinita è l’ora del sistema) |
Per saperne di più, effettua l’ordine strace -h
per elencare tutte le opzioni possibili.
Come funziona il comando strace
Strace si basa principalmente sulle chiamate di sistema ptrace per fornire un output significativo nel suo senso di debugging e debugging. ptrace viene utilizzato principalmente per ispezionare cosa stanno facendo gli altri programmi dopo uno specifico set di istruzioni. In termini semplici, strace chiamerà e segnalerà ptrace e si collegherà al programma analizzato.
Come usare il comando strace
Dimostrando come utilizzare il comando strace Linux, di seguito sono riportati alcuni degli esempi che è possibile verificare per valutare ed esaminare le chiamate di processo di alcuni comuni comandi Linux.
Per impostazione predefinita, il nome, il valore restituito, i parametri e gli argomenti di ogni chiamata di sistema vengono stampati in errore standard o possono essere inviati a un file specificando l’opzione -o.
1. Tieni traccia delle chiamate di sistema
Per eseguire una traccia di base di un codice sorgente o di un nome di chiamata di sistema di un eseguibile binario, esaminiamo il comando pwd specificato. Corsa:
strace pwd
L’output conterrà le seguenti informazioni:

Come visto sopra, strace traccerà il comando specificato a partire dalla posizione del comando pwd fino all’output di pwd, che sta stampando la directory di lavoro. Un valore pari a zero (0) significa che il codice aveva uno stato di uscita senza errori.
Un uso di strace (oltre alla risoluzione dei problemi) è che puoi scoprire quali file di configurazione vengono letti da un programma.
Per esempio:
strace php 2>&1 | grep php.ini
2. Tenere traccia dell’applicazione in esecuzione utilizzando PID
Quando un particolare programma o codice sorgente è già stato avviato e l’output richiede molto più tempo del previsto, puoi anche allegare strace a un’applicazione già in esecuzione. Basta determinare l’ID di quel processo. Puoi farlo eseguendo il comando dato:
sudo strace -p <PID>
Questo comando visualizzerà continuamente le chiamate di sistema effettuate dal processo. Puoi premere CTRL+C per fermarlo.

Alcuni processi eseguiti da altri programmi possono essere esaminati solo con l’accesso dell’utente root. Come mostrato sopra, puoi esaminare il codice di uscita per ogni successiva chiamata di sistema
3. Segui i bivi
Puoi anche tracciare le forcelle di un particolare processo. Per fare ciò, emettere il comando dato:
strace -f -p <PID>

Nell’esempio sopra, tracciamo i fork del comando htop con PID 4483. Viene mostrato anche il codice di uscita per ogni successiva chiamata di sistema
4. Filtrare chiamate di sistema specifiche
È possibile filtrare determinate chiamate di sistema semplicemente aggiungendo la variabile -e. È possibile filtrare le chiamate di sistema grezze, leggere il segnale o scrivere in base alla documentazione strace. Eseguire strace nel seguente esempio:
strace -e read htop

Nell’esempio sopra, abbiamo filtrato i nomi delle chiamate di sistema lette su htop.
Puoi combinare diversi valori assegnati alla variabile -e. Un altro esempio sopra mostra le chiamate di sistema di lettura e scrittura dal comando timedatectl.

In ogni caso, il valore restituito dovrebbe essere sempre zero senza errori
Per visualizzare i file aperti da un processo specifico come SSH, eseguire il seguente comando:
strace -f -e open /usr/sbin/sshd 2>&1 | grep ssh
Per tracciare le chiamate di sistema relative alla rete, eseguire il seguente comando:
strace -e network nc -v -n 127.0.0.1 80
5. Stampare il tempo speso per le chiamate di sistema
Per conoscere il tempo impiegato dalle chiamate di sistema per un particolare processo, segui questa sintassi e inseriscila nella riga di comando
strace -r pwd

La prima colonna indica il tempo impiegato dalle chiamate di sistema prima di passare alla successiva.
6. Mostra timestamp
È possibile visualizzare il timestamp seguendo la sintassi:
strace -tt <executable>
Nell’esempio seguente, l’output visualizza una parte del comando timedatectl, con la prima colonna che mostra il timestamp per la stampa.

Per stampare l’ora dell’orologio da parete di ciascuna chiamata di sistema, è sufficiente eseguire quanto segue sulla riga di comando:
strace -t pwd

Infine, per visualizzare la differenza di orario, eseguire quanto segue nella riga di comando:
strace -T pwd

La differenza di orario verrà visualizzata nell’ultima colonna dell’output strace.
7. Visualizzare il puntatore di istruzione della chiamata di sistema
Per visualizzare il flag di istruzione di un nome di chiamata di sistema, specificare il flag -i sulla riga di comando. Esempio:
strace -i w

In questo esempio, viene stampato il puntatore di istruzione di un nome di chiamata di sistema.
8. Generare un rapporto sulle chiamate di sistema
Un modo utile e semplice per riassumere strace è semplicemente visualizzare il rapporto sulle chiamate di sistema. Segui la sintassi ed esegui strace:
strace -c <executable>

9. Tieni traccia delle chiamate di sistema in base a una determinata condizione
È anche possibile riprovare in base a una specifica chiamata di sistema sopprimendo gli output indesiderati. Includere il flag -q durante l’utilizzo del flag -e per acquisire condizioni di competizione
strace -q -e memory pwd

Il valore restituito dovrebbe sempre mostrare uno zero per nessun errore.
10. Stampa Debug Output di trace
Per visualizzare e stampare le informazioni di debug, applica il flag -d. Eseguire il seguente esempio:
strace -d pwd

In questo esempio, l’output di debug viene visualizzato come errore standard o stderr in ogni fase della chiamata di sistema.
11. Inviare la traccia a un file
In quest’ultimo esempio, puoi anche salvare gli output di strace in un file per una successiva elaborazione e valutazione. Per fare ciò, segui la sintassi:
strace -o <filename> <executable>

In questo esempio, l’output è stato salvato nel file pwd.log. Il valore restituito e altri parametri vengono registrati nel processo.
Conclusione
Il sistema Linux ha molti utili strumenti di debug per il debug e il debug di codice e binari compilati. Strace Process Monitor è solo uno dei tanti che ha dimostrato molte funzionalità interessanti e coinvolgenti che possono rendere la tua vita di programmatore più facile e più preziosa.
Poiché le chiamate di sistema e i segnali sono eventi che si verificano nell’interfaccia utente o nel kernel di Linux, strace è utile durante il debug. Puoi sempre visitare il funzionario strace pagina di manuale per saperne di più sull’ordinazione.
Sfoglia il sito all-in-one di Comandi Linux per più apprendimento.