為了抓住一個自定義的內核函數是如何被執行的,需要一定的調試手段,其實就需要一種跟蹤手段就可以了,理論上不太復雜,可是Linux內核的調試接口太多了,始終找不到一個方便的,直到遇到了ftrace,它簡單的使用文件系統作為接口,不需要安裝任何用戶態程序,和雜亂的發行版毫無關系,這正合我意,相比SystemTap等復雜的前置設置等調試手段,簡直棒極了。因為我很討厭為了做一件理論上很簡單的事而去花去大量的時間去做前置工作。
使用文件系統作為接口的優勢自然不必多說,它可以將任意復雜的操作映射到既有的簡單的讀,寫,控制,打開,關閉等簡單操作上,ftrace的另一個妙點在於其動態二進制修正技術。其實kprobe也是使用了二進制修正技術,然而它做的很硬,而ftrace則使用了GCC內置的mcount機制,通過重載mcount函數來完成對任意函數調用的統計。
mcount機制是GCC的一個特性,在任何函數調用時,會紀錄關於該函數的一些信息。比如以下的程序:
mcount.c:
#include <stdio.h>
void mcount()
{
printf("@@@@\n");
}
gcc -c mcount.c
main.c:
#include <stdlib.h>
#include <stdio.h>
extern void mcount(void);
void b(int i)
{
printf("b:%d\n", i);
}
int a(int i)
{
b(i);
return 3;
}
int main()
{
int i = 3;
int k = a(i);
return k;
}