轉載: http://blog.csdn.net/ronliu/article/details/6446251
linux中大量使用函數指針鈎子,導致閱讀代碼困難。比如想知道一個函數的調用路徑,那么就只能用source insight之類的工具看代碼了。有沒有辦法可以迅速獲得調用關系的整體印象?ftrace是內核提供的一種調試工具,可以對內核中發生的事情進行跟 蹤。比如函數的調用,進程的切換,中斷的開關等等。這里利用這個工具來跟蹤函數的調用。
# cat /boot/config-2.6.36 | grep FTRACE CONFIG_HAVE_FTRACE_NMI_ENTER=y CONFIG_HAVE_DYNAMIC_FTRACE=y CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y CONFIG_FTRACE_NMI_ENTER=y CONFIG_FTRACE=y #FTRACE打開后,編譯內核時會打開-pg選項。 CONFIG_FTRACE_SYSCALLS=y CONFIG_DYNAMIC_FTRACE=y CONFIG_FTRACE_MCOUNT_RECORD=y # CONFIG_FTRACE_STARTUP_TEST is not set
mkdir /debug
mount -t debugfs nodev /debug #掛載debugfs。ftrace使用debugfs作為配置工具
cd tracing #檢查是否存在tracing文件夾。如果不存在,當前內核不支持ftrace,需要重新編譯。參考文檔
tracing文件夾中有很多文件用於配置ftrace工具。
echo nop > current_tracer #清楚當前tracer。執行該操作,會將pid等清空。
echo function > current_tracer #跟蹤函數調用
echo 1 > tracing_enabled #打開ftrace開始跟蹤
echo 0 > tracing_enabled #關閉ftrace停止跟蹤
cat trace | less # 讀trace文件。可以使用vim等工具。
echo 1 > set_ftrace_pid #跟蹤單個進程(內核線程)的函數調用。有效值大於0。如果echo > set_ftrace_pid則清空該選項。
echo function_graph > current_tracer #以圖形化的方式跟蹤函數調用。如下圖所示。效果非常好。
默認情況下,會捕獲所有的內核函數調用。可以使用下面的命令進行過濾,只捕獲關心的函數調用。
echo sys_socket > set_graph_function #可以寫多個函數。也可以使用通配符*,如sys_*。
cat available_filter_functions | grep sys_ #查詢ftrace支持的包含sys_字符的函數。注意,內核中使用EXPORT_SYMBOL聲明的函數才能使用ftrace跟蹤。
參考文檔:
1. ftrace使用手冊:kernel-srctree/Documentation/trace/ftrace.txt
2. ftrace設計文檔:kernel-srctree/Documentation/trace/ftrace-design.txt
3. http://www.ibm.com/developerworks/cn/linux/l-cn-ftrace/index.html