Narzędzie służące do badania interakcji systemu operacyjnego z dowolnym programem. Wynik działania wypisywany jest na strumień diagnostyczny lub do pliku (opcja -o).
strace przechwytuje wywołania funkcji systemowych programu i otrzymywane przez niego sygnały.
Przykładowe wywołanie strace:
[mt211004@students ~]$ strace df
execve("/bin/df", ["df"], [/* 51 vars */]) = 0
brk(0) = 0x8051000
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=216857, ...}) = 0
mmap2(NULL, 216857, PROT_READ, MAP_PRIVATE, 3, 0) = 0xf7f73000
close(3) = 0
open("/lib/libc.so.6", O_RDONLY) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\2e\1\0004\0\0\0"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=1266080, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xf7f72000
mmap2(NULL, 1275472, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xf7e3a000
mmap2(0xf7f6c000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x131) = 0xf7f6c000
mmap2(0xf7f6f000, 9808, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xf7f6f000
close(3) = 0
(...)
W przypadku błędu (3-cia linijka) widzimy zwracaną wartość (-1), symbol błędu (ENOENT) i odpowiadający mu komunikat (No such file or directory).
ltrace jest narzędziem służącym do śledzenia wywołań funkcji bibliotecznych. Przykładowe wywołanie:
[mt211004@students ~]$ ltrace /bin/false
__libc_start_main(0x8048a64, 1, 0xffab5c24, 0x8049c2d, 0x8049c2c
setlocale(6, "") = "C"
bindtextdomain("coreutils", "/usr/share/locale") = "/usr/share/locale"
textdomain("coreutils") = "coreutils"
__cxa_atexit(0x8048d8d, 0, 0, 1, 0x8048ac7) = 0
exit(1
__fpending(0xf7f4d4e0, 0x80484c4, -1, 0xf7f4cff4, 0xf7fa1ca0) = 0
fclose(0xf7f4d4e0) = 0
__fpending(0xf7f4d580, 0x80484c4, -1, 0xf7f4cff4, 0xf7fa1ca0) = 0
fclose(0xf7f4d580) = 0
+++ exited (status 1) +++
Warto wspomnieć, że nie jest potrzebne, aby posiadać źródła badanego programu, ani tym bardziej żeby był skompilowany z opcja -g.