紀錄一下在 linux 上不同層級的 tracing tool,xtrace 系列為主..
- ltrace:system library function trace, ex : printf
- ftrace:kernel function trace, ex : ext4_xxx,適合透過 filter 來 trace kernel module。
- strace:system call function trace, ex : open,可以用來追蹤像 apache & PHP 的一些錯誤發生的函式或效能的瓶頸。
- ptrace:process trace
- fenris:application tracer, its “GUI”, and an interactive debugger / GUI
- dtrace:solaris 的 debug 工具。
- systemtap:類似 dtrace。
- utrace:Utrace 是 Linux 中最新的 trace 和 debug 基礎構架
based on gdb, user level trace
- etrace:Run-time function call tree with gcc
- call-graphs-using-the-gnu-project-debugger : 這個 script 寫的很好,可以無腦套用。
- trace-and-profile-function-calls-with-gcc
systemtap function trace example
由於 utrace 是 redhat 在維護,所以這個 user space trace 是 systemtap + utrace 最好是用新一點的 fedora 才能跑,我用自己 patch utrace 的 ubuntu 10.4 跑不起來,應該是 systemtap 版本的問題。
//kernel space $ stap -e 'probe kernel.function("*").call { log(probefunc()) }' //user space 要 trace 的程式編譯時需要 gcc -g $ stap -e 'probe process("main").function("*").call { log(probefunc()) }' -c ./main
參考 ftrace 格式用 systemtap 寫 process function trace..
function timestamp:long() { return gettimeofday_us() - trace[depth] } function trace(entry_p) { printf("(%d) %d us |%s %s%s\n", cpu(), timestamp(), thread_indent(entry_p*2), (entry_p>0 ? probefunc() : ""), (entry_p>0 ? "() {" : "}") ) } global trace global depth probe process(@1).function("*").call { depth++ trace[depth] = gettimeofday_us() trace(1) } probe process(@1).function("*").return { trace(-1) delete trace[depth] depth-- } # example output $ stap -c ./main pftrace.stp main (2) 1 us | 0 main(9017): main() { (2) 0 us | 12 main(9017): foo() { (2) 7 us | 18 main(9017): } (2) 1 us | 25 main(9017): bar() { (2) 0 us | 34 main(9017): barone() { (2) 6 us | 40 main(9017): } (2) 0 us | 46 main(9017): bartwo() { (2) 6 us | 51 main(9017): } (2) 30 us | 54 main(9017): } (2) 59 us | 57 main(9017): }
參考資料:
- http://www.kgdb.info/
- http://stackoverflow.com/questions/311840/tool-to-trace-local-function-calls-in-linux
- http://lcamtuf.coredump.cx/fenris/debug-tools.html
- Spying on Apache and PHP with Strace
- ibm utrace
- utrace patch
- 在Ubuntu10.10上升級內核到2.6.36使用systemtap