GNU/Linux >> Linux Esercitazione >  >> Linux

7 Esempi di Strace per eseguire il debug dell'esecuzione di un programma in Linux

Strace è uno strumento di debug che ti aiuterà a risolvere i problemi.

Strace controlla le chiamate di sistema ei segnali di un programma specifico. È utile quando non si dispone del codice sorgente e si desidera eseguire il debug dell'esecuzione di un programma. strace ti fornisce la sequenza di esecuzione di un binario dall'inizio alla fine.

Questo articolo spiega 7 esempi di strace per iniziare.

1. Traccia l'esecuzione di un eseguibile

È possibile utilizzare il comando strace per tracciare l'esecuzione di qualsiasi eseguibile. L'esempio seguente mostra l'output di strace per il comando ls di Linux.

$  strace ls
execve("/bin/ls", ["ls"], [/* 21 vars */]) = 0
brk(0)                                  = 0x8c31000
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
mmap2(NULL, 8192, PROT_READ, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb78c7000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY)      = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=65354, ...}) = 0
...
...
...

2. Traccia una chiamata di sistema specifica in un eseguibile utilizzando l'opzione -e

Per impostazione predefinita, strace visualizza tutte le chiamate di sistema per l'eseguibile specificato. Per visualizzare solo una specifica chiamata di sistema, utilizzare l'opzione strace -e come mostrato di seguito.

$ strace -e open ls
open("/etc/ld.so.cache", O_RDONLY)      = 3
open("/lib/libselinux.so.1", O_RDONLY)  = 3
open("/lib/librt.so.1", O_RDONLY)       = 3
open("/lib/libacl.so.1", O_RDONLY)      = 3
open("/lib/libc.so.6", O_RDONLY)        = 3
open("/lib/libdl.so.2", O_RDONLY)       = 3
open("/lib/libpthread.so.0", O_RDONLY)  = 3
open("/lib/libattr.so.1", O_RDONLY)     = 3
open("/proc/filesystems", O_RDONLY|O_LARGEFILE) = 3
open("/usr/lib/locale/locale-archive", O_RDONLY|O_LARGEFILE) = 3
open(".", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY|O_CLOEXEC) = 3
Desktop  Documents  Downloads  examples.desktop  libflashplayer.so 
Music  Pictures  Public  Templates  Ubuntu_OS  Videos

L'output sopra mostra solo la chiamata di sistema aperta del comando ls. Alla fine dell'output di strace, mostra anche l'output del comando ls.

Se si desidera tracciare più chiamate di sistema, utilizzare l'opzione "-e trace=". L'esempio seguente mostra le chiamate di sistema aperte e lette.

$ strace -e trace=open,read ls /home
open("/etc/ld.so.cache", O_RDONLY)      = 3
open("/lib/libselinux.so.1", O_RDONLY)  = 3
read(3, "\177ELF\1\1\1\3\3\1\260G004"..., 512) = 512
open("/lib/librt.so.1", O_RDONLY)       = 3
read(3, "\177ELF\1\1\1\3\3\1\300\30004"..., 512) = 512
..
open("/lib/libattr.so.1", O_RDONLY)     = 3
read(3, "\177ELF\1\1\1\3\3\1\360\r004"..., 512) = 512
open("/proc/filesystems", O_RDONLY|O_LARGEFILE) = 3
read(3, "nodev\tsysfs\nnodev\trootfs\nnodev\tb"..., 1024) = 315
read(3, "", 1024)                       = 0
open("/usr/lib/locale/locale-archive", O_RDONLY|O_LARGEFILE) = 3
open("/home", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY|O_CLOEXEC) = 3
bala

3. Salva l'esecuzione della traccia in un file utilizzando l'opzione -o

Gli esempi seguenti memorizzano l'output di strace nel file output.txt.

$ strace -o output.txt ls
Desktop  Documents  Downloads  examples.desktop  libflashplayer.so
Music  output.txt  Pictures  Public  Templates  Ubuntu_OS  Videos

$ cat output.txt 
execve("/bin/ls", ["ls"], [/* 37 vars */]) = 0
brk(0)                                  = 0x8637000
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
mmap2(NULL, 8192, PROT_READ, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7860000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY)      = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=67188, ...}) = 0
...
...

4. Esegui Strace su un processo Linux in esecuzione utilizzando l'opzione -p

È possibile eseguire strace su un programma già in esecuzione utilizzando l'id del processo. Innanzitutto, identifica il PID di un programma usando il comando ps.

Ad esempio, se vuoi fare strace sul programma firefox attualmente in esecuzione, identifica il PID del programma firefox.

$ ps -C firefox-bin
  PID TTY          TIME CMD
 1725 ?        00:40:50 firefox-bin

Utilizzare l'opzione strace -p come mostrato di seguito per visualizzare lo strace per un determinato ID processo.

$  sudo strace -p 1725 -o firefox_trace.txt

$ tail -f firefox_trace.txt

Ora la traccia di esecuzione del processo Firefox verrà registrata nel file di testo firefox_trace.txt. Puoi accodare questo file di testo per guardare la traccia in tempo reale dell'eseguibile Firefox.

Strace visualizzerà il seguente errore quando il tuo ID utente non corrisponde all'ID utente del processo specificato.

$  strace -p 1725 -o output.txt
attach: ptrace(PTRACE_ATTACH, ...): Operation not permitted
Could not attach to process.  If your uid matches the uid of the target
process, check the setting of /proc/sys/kernel/yama/ptrace_scope, or try
again as the root user.  For more details, see /etc/sysctl.d/10-ptrace.conf

5. Stampa timestamp per ciascuna riga di output di traccia utilizzando l'opzione -t

Per stampare il timestamp per ciascuna riga di output strace, utilizzare l'opzione -t come mostrato di seguito.

$ strace -t -e open ls /home
20:42:37 open("/etc/ld.so.cache", O_RDONLY) = 3
20:42:37 open("/lib/libselinux.so.1", O_RDONLY) = 3
20:42:37 open("/lib/librt.so.1", O_RDONLY) = 3
20:42:37 open("/lib/libacl.so.1", O_RDONLY) = 3
20:42:37 open("/lib/libc.so.6", O_RDONLY) = 3
20:42:37 open("/lib/libdl.so.2", O_RDONLY) = 3
20:42:37 open("/lib/libpthread.so.0", O_RDONLY) = 3
20:42:37 open("/lib/libattr.so.1", O_RDONLY) = 3
20:42:37 open("/proc/filesystems", O_RDONLY|O_LARGEFILE) = 3
20:42:37 open("/usr/lib/locale/locale-archive", O_RDONLY|O_LARGEFILE) = 3
20:42:37 open("/home", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY|O_CLOEXEC) = 3
bala

6. Stampa il tempo relativo per le chiamate di sistema utilizzando l'opzione -r

Strace ha anche la possibilità di stampare il tempo di esecuzione per ciascuna chiamata di sistema come mostrato di seguito.

$ strace -r ls 
     0.000000 execve("/bin/ls", ["ls"], [/* 37 vars */]) = 0
     0.000846 brk(0)                    = 0x8418000
     0.000143 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
     0.000163 mmap2(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb787b000
     0.000119 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
     0.000123 open("/etc/ld.so.cache", O_RDONLY) = 3
     0.000099 fstat64(3, {st_mode=S_IFREG|0644, st_size=67188, ...}) = 0
     0.000155 mmap2(NULL, 67188, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb786a000
     ...
     ...

7. Genera rapporto statistico delle chiamate di sistema utilizzando l'opzione -c

Utilizzando l'opzione -c, strace fornisce un utile report statistico per la traccia di esecuzione. La colonna "chiamate" nell'output seguente indicava quante volte è stata eseguita quella particolare chiamata di sistema.

$ strace -c ls /home
bala
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
  -nan    0.000000           0         9           read
  -nan    0.000000           0         1           write
  -nan    0.000000           0        11           open
  -nan    0.000000           0        13           close
  -nan    0.000000           0         1           execve
  -nan    0.000000           0         9         9 access
  -nan    0.000000           0         3           brk
  -nan    0.000000           0         2           ioctl
  -nan    0.000000           0         3           munmap
  -nan    0.000000           0         1           uname
  -nan    0.000000           0        11           mprotect
  -nan    0.000000           0         2           rt_sigaction
  -nan    0.000000           0         1           rt_sigprocmask
  -nan    0.000000           0         1           getrlimit
  -nan    0.000000           0        25           mmap2
  -nan    0.000000           0         1           stat64
  -nan    0.000000           0        11           fstat64
  -nan    0.000000           0         2           getdents64
  -nan    0.000000           0         1           fcntl64
  -nan    0.000000           0         2         1 futex
  -nan    0.000000           0         1           set_thread_area
  -nan    0.000000           0         1           set_tid_address
  -nan    0.000000           0         1           statfs64
  -nan    0.000000           0         1           set_robust_list
------ ----------- ----------- --------- --------- ----------------
100.00    0.000000                   114        10 total

Linux
  1. Il comando Sed di Linux:utilizzo ed esempi

  2. Trova il tempo di esecuzione di un comando o di un processo in Linux

  3. Esempi essenziali del comando file in Linux

  4. 5 Esempi pratici del comando dd in Linux

  5. Ottieni il tempo di esecuzione del programma nella shell

I 50 esempi pratici del comando SED in Linux

10 esempi utili del comando di ordinamento in Linux

5 Esempi pratici del comando Read in Linux

Esempi essenziali del comando ps in Linux

5 Esempi del comando Netcat (nc) in Linux

15 esempi super utili del comando Trova in Linux