Come usare Strace su Linux

Come usare Strace su Linux
Quando si lavora con Linux Systems, dovrai spesso ispezionare e comprendere le azioni eseguite dai processi e le chiamate di sistema effettuate dalla loro esecuzione.

Quando si tratta di eseguire tali attività, il kernel Linux fornisce funzionalità come PTRACE per debug e diagnosticare i processi.

Questo articolo discute come utilizzare lo strumento Strace per tracciare, monitorare e debug Processi che interagiscono con il kernel.

Cosa sono le chiamate di sistema?

Prima di discutere su come usare Strace, devi capire cosa stiamo cercando e come funzionano. Ciò significa che dovremmo esaminare le basi delle chiamate di sistema Linux.

Una chiamata di sistema è Un metodo programmatico attraverso il quale un programma può richiedere un servizio dal kernel del sistema. Questo è il processo che useremo per ispezionare le azioni tra i processi utente e il kernel Linux.

Ogni volta che un utente esegue un programma che fa leggere, scrivere, uccidere, uscire, bind, ecc., richiesta, stanno facendo una chiamata di sistema. Esiste una vasta gamma di chiamate di sistema utilizzate dai programmi per eseguire varie attività come il networking, la lettura e la scrittura ai file, l'inizializzazione e la terminazione dei processi e molto altro.

Pensa alle chiamate di sistema come funzioni: si comportano allo stesso modo perché possono accettare argomenti e restituire valori. La differenza principale tra le chiamate di sistema e il funzionamento normale è che le chiamate di sistema possono interagire direttamente con il kernel. Le chiamate di sistema utilizzano un meccanismo trap per navigare tra lo spazio utente e il kernel.

Nel sistema Linux, questo meccanismo è ben nascosto dagli utenti da librerie come GLIBC.

NOTA: C'è molto di più nelle chiamate di sistema e nelle interazioni del kernel rispetto a quelle che abbiamo discusso in questo tutorial. Per ulteriori informazioni, fare riferimento alle pagine manuali.

https: // linkfy.a/syscalls

https: // linkfy.a/trapmanual

Come installare Strace su Linux

Sebbene gli strumenti Strace non vengano preinstallati per impostazione predefinita nelle principali distribuzioni Linux, è disponibile nella maggior parte dei repository ufficiali di queste distribuzioni; È possibile installarlo facilmente utilizzando i pacchetti predefiniti.

NOTA: Anche se non copriremo come installare Strace su tutti i sistemi, discuteremo di come farlo con i principali gestori di pacchetti come APT, DNF, Pacman e Yum

1: installazione di Debian (APT)

Installa Strace usando il comando:

Apt -get Installa Strace -y

2: Redhat Family (DNF e Yum)

Per installare Strace tramite Gestione pacchetti Yum, immettere il comando:

Yum Installa Strace

Per DNF Package Manager, immettere il comando:

DNF Installa Strace

3: Arch Linux (Pacman)

Per gli utenti di Arch Linux, è possibile installare Strace con il comando:

Pacman -s Strace

Ora che hai Strace installato e funzionante, possiamo andare avanti e imparare a usare

Uso di base Strace: una guida pratico

Discutiamo l'utilizzo di Strace di base e comprendiamo l'output di base del comando e come possiamo usarlo.

NOTA: Output di Strace come chiamate di sistema, argomenti corrispondenti e valori di restituzione vengono gestiti dal descrittore dei file di errore standard (STDERR).

Il modo base di usare Strace è chiamare l'utilità Strace seguita dal nome del programma, il cui comportamento vogliamo capire.

Ecco un esempio di quello che utilizza il comando LS:

Oh! Questo è un sacco di output per un semplice comando come LS.

Sebbene non possiamo discutere tutto l'output dal comando Strace, possiamo distillare e capirne il significato.

Se si considera la prima riga nell'output sopra, noterai le seguenti funzionalità.

  • Il nome della chiamata di sistema
  • Gli argomenti passati alla chiamata di sistema racchiusi tra parentesi.
  • Il valore di ritorno dalla chiamata di sistema

Quindi, nella prima riga, la chiamata di sistema è Execve (Execute Program utilizzando l'array specificata di argomenti), gli argomenti della chiamata di sistema sono ("/bin/ls", ["ls", "/"], 0x7fffc4b277a8/ * 13 vars */) e un valore di ritorno di 0.

https: // linkfy.a/execve

Le chiamate di sistema Execve eseguono il binario che vogliamo utilizzare, in questo caso, situato in (/bin/ls) e l'array di argomenti è il percorso che vogliamo elencare i contenuti.

Noterai anche una notazione chiusa con una barra in avanti e un asterisco. Per il nostro esempio:

/ * 13 vars */

L'output di cui sopra indica il numero di variabili aggiunte a seguito della chiamata del processo. L'ambiente all'interno della funzione Execv è accessibile utilizzando la variabile esterna Environ definita come:

int main (int argc, char *argv [], char *envp [])

L'output finale è il valore di ritorno, che è 0 in questo caso.

Noterai anche che la maggior parte delle righe dell'uscita Strace seguono un modello simile che abbiamo discusso sopra.

Come tracciare le chiamate di sistema specifiche

Sebbene Strace fornisca molte informazioni relative alle chiamate di sistema di programmi, la maggior parte delle istanze chiamerà per filtrare le chiamate di sistema specifiche. Per fare ciò, passiamo il flag -e al comando Strace seguito dal nome della chiamata di sistema di cui abbiamo bisogno.

Che ne dici di guardare il sistema di lettura chiama il comando LS. Per esempio:

Strace -e Leggi LS

Noterai che questo visualizza solo le chiamate di lettura del sistema.

La chiamata del sistema di lettura accetta tre argomenti: descrittore di file, buffer e il numero di byte. La chiamata di sistema si legge quindi ai byte di conteggio dall'argomento del descrittore dei file passati nel buffer.

https: // linkfy.a/readsyscall

Riepilogo delle chiamate di sistema

Strace ci consente anche di ottenere un riepilogo delle chiamate di sistema effettuate da un processo. Passando l'argomento -c o solo per la sola discussione, possiamo ottenere un output come quello mostrato di seguito:

I comandi filtrano e organizza l'output in modo più efficiente della normale uscita dello strace. Per ottenere sia il riepilogo che il normale output di strani, passa l'argomento -c.

Come usare Strace con i processi in esecuzione

Altre volte, avrai bisogno di una traccia di un processo di esecuzione. Fino a questo punto, abbiamo usato Strace solo un singolo comando. Per tracciare un processo di esecuzione, possiamo utilizzare l'argomento -p seguito dal processo di ID processo (PID) per collegare Strace ad esso.

È possibile ottenere il PID di un processo di esecuzione utilizzando Top e Grep, PS, Htop, PIDOF o altri strumenti di monitoraggio del sistema.

Ad esempio, per ottenere il PID del processo Apache, possiamo usare:

PS -ax | grep -i apache2

Ciò dovrebbe darti il ​​PID del processo APACHE2 (PID 3514 in questo caso) e possiamo usarlo per attaccarlo a Strace.

Ciò dovrebbe visualizzare un'uscita simile a quella mostrata di seguito.

Strace traccerà continuamente il processo allegato e mostrerà l'output mentre il processo allegato esegue le chiamate di sistema. Per terminare la traccia, premere CTRL + C, che stacca il processo dallo Strace.

Come salvare l'output di Strace nei file

Possiamo anche reindirizzare l'output di Strace su un file come argomento. Usando il flag -o seguito dal percorso del file come argomento, possiamo salvare i registri Strace.

Per esempio:

Strace -P 3514 -O ~/Desktop/Apache_Trace

Una volta salvato il file, puoi successivamente monitorare e analizzarlo.

Conclusione

In questa guida, abbiamo imparato come installare e utilizzare Strace sulle principali distribuzioni Linux. Ora che capisci le chiamate di sistema e come funzionano i processi, puoi utilizzare Strace per monitorare e eseguire il debug di un processo di sistema in esecuzione in esecuzione.

I concetti appresi in questo tutorial sono molto utili, principalmente perché puoi usare ciò che hai imparato a monitorare se qualcuno sta manomettendo i processi di sistema.