GNU/Linux >> LINUX-Kenntnisse >  >> Linux

7 Strace-Beispiele zum Debuggen der Ausführung eines Programms unter Linux

Strace ist ein Debugging-Tool, mit dem Sie Probleme beheben können.

Strace überwacht die Systemaufrufe und Signale eines bestimmten Programms. Es ist hilfreich, wenn Sie den Quellcode nicht haben und die Ausführung eines Programms debuggen möchten. strace liefert Ihnen die Ausführungsreihenfolge einer Binärdatei von Anfang bis Ende.

Dieser Artikel erklärt 7 Strace-Beispiele, um Ihnen den Einstieg zu erleichtern.

1. Verfolgen Sie die Ausführung einer ausführbaren Datei

Sie können den Befehl strace verwenden, um die Ausführung einer beliebigen ausführbaren Datei zu verfolgen. Das folgende Beispiel zeigt die Ausgabe von strace für den Linux-Befehl 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. Verfolgen Sie einen bestimmten Systemaufruf in einer ausführbaren Datei mit der Option -e

Standardmäßig zeigt strace alle Systemaufrufe für die angegebene ausführbare Datei an. Um nur einen bestimmten Systemaufruf anzuzeigen, verwenden Sie die Option strace -e wie unten gezeigt.

$ 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

Die obige Ausgabe zeigt nur den offenen Systemaufruf des Befehls ls an. Am Ende der strace-Ausgabe wird auch die Ausgabe des ls-Befehls angezeigt.

Wenn Sie mehrere Systemaufrufe verfolgen möchten, verwenden Sie die Option „-e trace=“. Das folgende Beispiel zeigt sowohl offene als auch gelesene Systemaufrufe.

$ 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. Speichern Sie die Trace-Ausführung mit der Option -o

in einer Datei

Die folgenden Beispiele speichern die Strace-Ausgabe in der Datei 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. Führen Sie Strace auf einem laufenden Linux-Prozess mit der Option -p

aus

Sie könnten strace auf einem Programm ausführen, das bereits mit der Prozess-ID ausgeführt wird. Identifizieren Sie zuerst die PID eines Programms mit dem Befehl ps.

Wenn Sie zum Beispiel Strace auf dem derzeit laufenden Firefox-Programm ausführen möchten, identifizieren Sie die PID des Firefox-Programms.

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

Verwenden Sie die Option strace -p wie unten gezeigt, um die Strace für eine bestimmte Prozess-ID anzuzeigen.

$  sudo strace -p 1725 -o firefox_trace.txt

$ tail -f firefox_trace.txt

Jetzt wird die Ablaufverfolgung des Firefox-Prozesses in der Textdatei firefox_trace.txt protokolliert. Sie können diese Textdatei tailen, um den Live-Trace der ausführbaren Firefox-Datei zu sehen.

Strace zeigt den folgenden Fehler an, wenn Ihre Benutzer-ID nicht mit der Benutzer-ID des angegebenen Prozesses übereinstimmt.

$  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. Drucken Sie den Zeitstempel für jede Trace-Ausgabezeile mit der Option -t

Um den Zeitstempel für jede Strace-Ausgabezeile zu drucken, verwenden Sie die Option -t wie unten gezeigt.

$ 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. Gibt die relative Zeit für Systemaufrufe mit der Option -r

aus

Strace hat auch die Möglichkeit, die Ausführungszeit für jeden Systemaufruf wie unten gezeigt auszudrucken.

$ 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. Generieren Sie einen Statistikbericht über Systemaufrufe mit der Option -c

Mit der Option -c liefert strace einen nützlichen Statistikbericht für die Ablaufverfolgung der Ausführung. Die Spalte „Aufrufe“ in der folgenden Ausgabe gibt an, wie oft dieser bestimmte Systemaufruf ausgeführt wurde.

$ 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. Der Linux-Sed-Befehl:Verwendung und Beispiele

  2. Finden Sie die Ausführungszeit eines Befehls oder Prozesses in Linux

  3. Wesentliche Beispiele für den Dateibefehl in Linux

  4. 10 pidstat-Beispiele zum Debuggen von Leistungsproblemen des Linux-Prozesses

  5. Holen Sie sich die Programmausführungszeit in der Shell

Die 50 praktischen Beispiele des SED-Befehls in Linux

10 Nützliche Beispiele für den Sort-Befehl in Linux

5 praktische Beispiele für den Read-Befehl unter Linux

Wesentliche Beispiele des ps-Befehls in Linux

5 Beispiele für den Befehl Netcat (nc) unter Linux

15 super nützliche Beispiele für den Find-Befehl in Linux