使用ftrace學習linux內核函數調用


轉載: 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM