GNU/Linux >> Znalost Linux >  >> Linux

7 Vzorové příklady pro ladění spouštění programu v Linuxu

Strace je ladicí nástroj, který vám pomůže řešit problémy.

Strace monitoruje systémová volání a signály konkrétního programu. Je to užitečné, když nemáte zdrojový kód a chtěli byste odladit provádění programu. strace vám poskytuje sekvenci provádění binárního souboru od začátku do konce.

Tento článek vysvětluje 7 příkladů strace, abyste mohli začít.

1. Sledujte spuštění spustitelného souboru

Příkaz strace můžete použít ke sledování provádění libovolného spustitelného souboru. Následující příklad ukazuje výstup strace pro příkaz Linux ls.

$  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. Sledujte konkrétní systémová volání ve spustitelném souboru pomocí volby -e

Ve výchozím nastavení strace zobrazuje všechna systémová volání pro daný spustitelný soubor. Chcete-li zobrazit pouze určité systémové volání, použijte volbu strace -e, jak je uvedeno níže.

$ 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

Výše uvedený výstup zobrazuje pouze otevřené systémové volání příkazu ls. Na konci výstupu strace také zobrazí výstup příkazu ls.

Pokud chcete trasovat více systémových volání, použijte volbu „-e trace=“. Následující příklad zobrazuje otevřené i přečtené systémové volání.

$ 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. Uložte spuštění trasování do souboru pomocí volby -o

Následující příklady ukládají výstup strace do souboru 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. Spusťte Strace na běžícím procesu Linuxu pomocí volby -p

Pomocí ID procesu můžete spustit strace na programu, který již běží. Nejprve identifikujte PID programu pomocí příkazu ps.

Pokud například chcete provést strace na aktuálně spuštěném programu firefox, identifikujte PID programu firefox.

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

Použijte volbu strace -p, jak je uvedeno níže, k zobrazení strace pro dané ID procesu.

$  sudo strace -p 1725 -o firefox_trace.txt

$ tail -f firefox_trace.txt

Nyní bude trasování provedení procesu firefox přihlášeno do textového souboru firefox_trace.txt. Tento textový soubor můžete sledovat a sledovat živou stopu spustitelného souboru firefox.

Strace zobrazí následující chybu, když vaše uživatelské ID neodpovídá uživatelskému ID daného procesu.

$  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. Vytisknout časové razítko pro každý výstupní řádek trasování pomocí volby -t

Chcete-li vytisknout časové razítko pro každý výstupní řádek sledování, použijte volbu -t, jak je uvedeno níže.

$ 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. Tisk relativního času pro systémová volání pomocí volby -r

Strace má také možnost vytisknout dobu provedení pro každé systémové volání, jak je uvedeno níže.

$ 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. Vygenerujte statistiku systémových volání pomocí volby -c

Pomocí volby -c poskytuje strace užitečnou statistickou zprávu pro sledování provádění. Sloupec „volání“ v následujícím výstupu udává, kolikrát bylo konkrétní systémové volání provedeno.

$ 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. Najděte čas provedení příkazu nebo procesu v systému Linux

  2. 9 Užitečné příklady příkazu Split v Linuxu

  3. Praktické příklady příkazu Unzip v Linuxu

  1. Základní příklady příkazu File v Linuxu

  2. Získejte čas provádění programu v shellu

  3. Spuštění potenciálně škodlivého programu na Linuxu

  1. Příkaz Linux Sed:Použití a příklady

  2. 5 Praktické příklady příkazu dd v Linuxu

  3. 10 příkladů pidstat pro ladění výkonnostních problémů procesu Linux