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 DateiDie 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
ausSie 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
ausStrace 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