Příkaz strace
Příkaz strace lze použít k zachycení a záznamu provedených systémových volání a signálů přijatých procesem. To umožňuje prozkoumat hraniční vrstvu mezi uživatelem a prostorem jádra, což může být velmi užitečné pro identifikaci toho, proč proces selhává.
Použití strace k analýze toho, jak program interaguje se systémem, je zvláště užitečné, když zdrojový kód není snadno dostupný. Kromě
jeho důležitosti při odstraňování problémů může strace poskytnout hluboký přehled o tom, jak systém funguje. Každý uživatel může sledovat své vlastní běžící procesy; kromě toho může uživatel root sledovat všechny běžící procesy. K připojení a sledování běžícího démona rsyslogd lze například použít následující:
# strace -p $(pgrep rsyslogd) Process 819 attached select(1, NULL, NULL, NULL, {83009, 275934} ...
výstup strace
Výstup ze strace bude odpovídat systémovému volání nebo signálu. Výstup ze systémového volání se skládá ze tří komponent:
1. Systémové volání
2. Jakékoli argumenty v závorkách
3. Výsledek volání za rovnítkem
Návratový stav -1 obvykle označuje chybu. Například:
# strace ls file1 execve("/bin/ls", ["ls", "file1"], [/* 21 vars */]) = 0 brk(0) = 0xadb000 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f516bb79000 ..... close(1) = 0 munmap(0x7f516bb78000, 4096) = 0 close(2) = 0 exit_group(0) = ? +++ exited with 0 +++
Složené závorky se používají k označení dereferencovaných C struktur. Čtvercové závorky se používají k označení jednoduchých ukazatelů nebo pole hodnot.
Příklady příkazu strace
Přesměrování trasování do souboru
Protože strace často vytváří velké množství výstupu, je často vhodné jej přesměrovat do souboru. Ke spuštění shellu bash, sledování všech rozvětvených podřízených procesů a zaznamenání všech přístupů k souborům do souboru files.trace lze například použít následující:
# strace -f -o files.trace -e trace=file bash
Počítání počtu systémových volání
Spusťte příkaz ls, který spočítá, kolikrát bylo uskutečněno každé systémové volání, a vytiskněte součty ukazující počet a čas strávený v každém volání (užitečné pro základní profilování nebo izolaci úzkých míst):
# strace -c ls
Zobrazení souborů otevřených procesem/démonem
Následující příklad ukazuje tři konfigurační soubory, které sshd OpenSSH čte při spuštění. Všimněte si, že strace ve výchozím nastavení odesílá svůj výstup do STDERR, takže pokud jej chcete převést pomocí kanálu na jiné příkazy, jako je grep pro další úpravy, musíte výstup vhodně přesměrovat:
# strace -f -eopen /usr/sbin/sshd 2>&1 | grep ssh
Sledování pouze systémových volání souvisejících se sítí
Sledujte pouze systémová volání související se sítí, když se Netcat pokouší připojit k místní službě telnetd:
# strace -e trace=network nc localhost 23
Příkaz ltrace
Příkaz ltrace lze použít k zachycení a záznamu dynamických volání sdílených knihoven. Množství výstupu generovaného příkazem ltrace může být u některých příkazů zahlcující (zejména pokud je volba -S použita také k zobrazení systémových volání). Výstup můžete zaměřit pouze na interakci mezi programem a některým seznamem knihoven. Chcete-li například provést příkaz id -Z a zobrazit volání modulu libselinux.so, proveďte:
$ ltrace -l /lib/libselinux.so.1 id -Z is_selinux_enabled(0xc1c7a0, 0x9f291e8, 0xc1affc, 0, -1)a =1 getcon(0x804c2c8, 0xfee80ff4, 0x804b179, 0x804c020, 0)a =0 user_u:system_r:unconfined_t
Nezapomeňte, že pomocí příkazu ldd můžete vidět, s jakými knihovnami je program propojen.