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à.
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.