30.5 Tracing
Manchmal ist ein Debugger zu viel des Guten und man möchte »einfach nur schnell wissen, was das Programm so ungefähr 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. [Fn. Dabei werden in der Regel jedoch keine programminternen Funktionen, sondern nur Syscalls protokolliert.]
Unter Solaris heißt dieses Tool beispielsweise truss, unter Linux strace und unter BSD ktrace. Unter Linux ruft man einfach strace Programmdatei auf; unter BSD ist der Aufruf des entsprechenden Tools minimal komplizierter: Zunächst wird mit ktrace <Programm> ein Dump des Programms erstellt, der dann mit dem Tool kdump analysiert werden kann. Dabei produziert kdump einen ähnlichen (und ebenfalls recht langen) Output wie strace oder truss. In solch einem Output findet man dann die Funktions-Calls (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.
Listing 30.27 Head-Output eines ktrace-Dumps mit kdump
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
Ihr Kommentar
Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen.