21.5 Tracing
Manchmal ist ein Debugger zu viel des Guten und man möchte »einfach nur schnell wissen, was das Programm im Groben macht«, was übersetzt bedeutet, dass man Informationen über den Programmablauf wünscht. Dabei ist gefragt, welche Funktionen in welcher Reihenfolge mit welchen Werten aufgerufen werden.
Um an diese Informationen zu gelangen, gibt es unter eigentlich jedem vernünftigen Unix(ähnlichen)-System ein oder mehrere Programme, um solch ein Programm-Tracing durchzuführen. <Dabei werden in der Regel jedoch keine programminternen Funktionen, sondern nur Syscalls aufgerufen.>
Unter Solaris heißt dieses Tool beispielsweise truss, unter Linux strace und unter BSD ktrace. Unter Linux ruft man dazu einfach strace Programmdatei auf, unter BSD ist dies minimal komplizierter:
Zunächst wird mit ktrace <Programm> ein Dump des Programms erstellt, das dann mit dem Tool kdump analysiert werden kann. Dabei produziert kdump einen ähnlichen (und ebenfalls recht langen) Output, wie strace oder truss ihn fabrizieren würden.
In solch einem Output findet man dann die Funktionscalls (call ist der Assembler-Befehl zum Aufruf einer Funktion) sowie die Parameter, die ihnen übergeben wurden. Oftmals können Hex-Werte als Pointer-Adressen verstanden werden. Das nachstehende Listing zeigt uns, dass ktrace zunächst über den execve()-Syscall das Tool tcpinject startet.
22851 ktrace RET ktrace 0 22851 ktrace CALL execve(0xcfbf1ef3,0xcfbf1ce8, 0xcfbf1cf0) 22851 ktrace NAMI "./tcpinject" 22851 tcpinject NAMI "/usr/libexec/ld.so" 22851 tcpinject EMUL "native" 22851 tcpinject RET execve 0 22851 tcpinject CALL issetugid 22851 tcpinject RET issetugid 0 22851 tcpinject CALL mprotect(0x20653000,0x1000, 0x1) 22851 tcpinject RET mprotect 0 22851 tcpinject CALL mmap(0,0x1000,0x3,0x1002, 0xffffffff,0,0,0) 22851 tcpinject RET mmap 2123247616/0x7e8e3000 22851 tcpinject CALL __sysctl(0xcfbf6918,0x2, 0xcfbf6910,0xcfbf6914,0,0) 22851 tcpinject RET __sysctl 0 22851 tcpinject CALL open(0x20651649,0,0) 22851 tcpinject NAMI "/var/run/ld.so.hints" 22851 tcpinject RET open 3 22851 tcpinject CALL fstat(0x3,0xcfbf6390) 22851 tcpinject RET fstat 0 22851 tcpinject CALL mmap(0,0x916d,0x1,0x2,0x3,0, 0,0) 22851 tcpinject RET mmap –2137796608/0x8093d000 22851 tcpinject CALL close(0x3) 22851 tcpinject RET close 0 22851 tcpinject CALL open(0x80941e40,0,0) 22851 tcpinject NAMI "/usr/lib/libc.so.34.2" 22851 tcpinject RET open 3 22851 tcpinject CALL fstat(0x3,0xcfbf583c) 22851 tcpinject RET fstat 0 22851 tcpinject CALL read(0x3,0xcfbf58ac,0x1000) 22851 tcpinject GIO fd 3 read 4088 bytes
Listing 21.27 Head-Output eines ktrace-Dumps mit kdump