linux tracing tools

紀錄一下在 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

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):  }

參考資料:

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *