strace

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(NULL216857PROT_READMAP_PRIVATE30) = 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(NULL4096PROT_READ|PROT_WRITEMAP_PRIVATE|MAP_ANONYMOUS, -10) = 0xf7f72000
mmap2(NULL1275472PROT_READ|PROT_EXECMAP_PRIVATE|MAP_DENYWRITE30) = 0xf7e3a000
mmap2(0xf7f6c00012288PROT_READ|PROT_WRITEMAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE30x131) = 0xf7f6c000
mmap2(0xf7f6f0009808PROT_READ|PROT_WRITEMAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -10) = 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

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(0x8048a6410xffab5c240x8049c2d0x8049c2c 
setlocale(6"")                                 = "C"
bindtextdomain("coreutils""/usr/share/locale") = "/usr/share/locale"
textdomain("coreutils")                          = "coreutils"
__cxa_atexit(0x8048d8d0010x8048ac7)      = 0
exit(1 
__fpending(0xf7f4d4e00x80484c4, -10xf7f4cff40xf7fa1ca0) = 0
fclose(0xf7f4d4e0)                               = 0
__fpending(0xf7f4d5800x80484c4, -10xf7f4cff40xf7fa1ca0) = 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.