內核的各個子系統已經有大量的跟蹤點,如果這些跟蹤點無法滿足工作中的需求,可以自己手動添加跟蹤點。
添加跟蹤點有兩種方式,一種是仿照events/目錄下的跟蹤點,使用TRACE_EVENT() 宏添加。另一種是參考內核目錄samples/trace_events添加。本文對這兩種方式分別進行介紹。
使用 TRACE_EVENT 定義 tracepoint
我們仿照events/timer/timer_start,添加一個timer_stat的跟蹤點,獲取start_pid和slack參數。
首先,需要在include/trace/events/timer.h頭文件種添加名為timer_stat的跟蹤點。
/** *timer_stat-ftraceinterfacetimer_stat *@timer:pointertostructtimer_list */ TRACE_EVENT(timer_stat, TP_PROTO(structtimer_list*timer), TP_ARGS(timer), TP_STRUCT__entry( __field(void*,timer) __field(int,start_pid) __field(int,slack) ), TP_fast_assign( __entry->timer=timer; __entry->start_pid=timer->start_pid; __entry->slack=timer->slack; ), TP_printk("ftraceinterfacetimer_stat:timer=%ppid=%dslack=%d ", __entry->timer,__entry->start_pid,__entry->slack) );
TRACE_EVENT()宏如下
#defineTRACE_EVENT(name,proto,args,struct,assign,print) DEFINE_TRACE(name)
name:表示跟蹤點的名字,如上面的timer_stat。
proto:表示跟蹤點調用的入參的原型,比如timer類型為struct timer_list *。
args:表示參數。
struct:定義跟蹤器內部使用的__entry數據結構。
assign:把參數復制到__entry數據結構中。
print:定義輸出的格式。
接著在kernel/kernel/time/timer.c debug_activate()添加trace_timer_stat()。
staticinlinevoid debug_activate(structtimer_list*timer,unsignedlongexpires) { debug_timer_activate(timer); trace_timer_start(timer,expires,timer->flags); trace_timer_stat(timer); }
重新編譯內核后,燒寫到設備中,即可看到sys節點已經有了新增的跟蹤點。
使能跟蹤點后,查看trace點的輸出。
編譯為獨立的ko文件
內核還提供了一個跟蹤點的例子,在samples/trace_events 目錄下。
trace_event_init()創建內核線程一個名為event-sample內核線程。
staticint__inittrace_event_init(void) { simple_tsk=kthread_run(simple_thread,NULL,"event-sample"); if(IS_ERR(simple_tsk)) return-1; return0; }
kthread_should_stop()用于創建的線程檢查結束標志,并決定是否退出。
staticintsimple_thread(void*arg) { intcnt=0; while(!kthread_should_stop()) simple_thread_func(cnt++); return0; }
set_current_state() 來設置進程的狀態,設置為TASK_INTERRUPTIBLE表示是可以被信號和wake_up()喚醒的,當信號到來時,進程會被設置為可運行。
schedule_timeout()將當前task調度出cpu,重新調度間隔為HZ。接著trace_開頭的函數就會依次打印跟蹤點的信息。
staticvoidsimple_thread_func(intcnt) { intarray[6]; intlen=cnt%5; inti; set_current_state(TASK_INTERRUPTIBLE); schedule_timeout(HZ); for(i=0;i
trace_foo_with_template_simple跟蹤點的實現方式也是使用的TRACE_EVENT ()宏,這里不再贅述。
最后將文件編譯為ko拷貝到設備上insmod后,即可看到sys目錄下已經有新增的節點。
cd/home/zhongyi/code/rk3399_linux_release_v2.5.1_20210301/kernel/samples/trace_events make-C/home/zhongyi/code/rk3399_linux_release_v2.5.1_20210301/kernel/M=$(pwd)modulesroot@firefly:/sys/kernel/debug/tracing#catavailable_events|grepsample sample-trace:foo_bar sample-trace:foo_bar_with_cond race:foo_bar_with_fn sample-trace:foo_with_template_simple sample-trace:foo_with_template_cond sample-trace:foo_with_template_fn sample-trace:foo_with_template_print power:pstate_sampleroot@firefly:/sys/kernel/debug/tracing#cdevents/sample-trace/ root@firefly:/sys/kernel/debug/tracing/events/sample-trace#ls enablefoo_bar_with_condfoo_with_template_fn filterfoo_bar_with_fnfoo_with_template_print foo_barfoo_with_template_condfoo_with_templ_simple root@firefly:/sys/kernel/debug/tracing/events/sample-trace#echo1>enable root@firefly:/sys/kernel/debug/tracing/events/sample-trace#cat/sys/kernel/debug/tracing/trace
TRACE_EVENT_CONDITION()
在某些情況下,跟蹤點只有在某個條件發生時才會被調用,類似于
if(cond) trace_foo();
TRACE_EVENT_CONDITION()宏就是這個作用,它和TRACE_EVENT()相比只是在參數中多加了一個cond條件。TP_CONDITION()會對條件做個判斷。
TRACE_EVENT(name,proto,args,struct,assign,printk) TRACE_EVENT_CONDITION(name,proto,args,cond,struct,assign,printk)
詳細使用方法可以參考trace-events-sample.h。
TRACE_EVENT_FN()
TRACE_EVENT_FN()是在跟蹤點使能前和使能后分別打印一些信息。相比于TRACE_EVENT(),TRACE_EVENT_FN()多了兩個參數reg和unreg,
TRACE_EVENT(name,proto,args,struct,assign,printk) TRACE_EVENT_FN(name,proto,args,struct,assign,printk,reg,unreg)
reg 和unreg原型為
voidreg(void)
reg函數在跟蹤點使能前打印,unreg函數在跟蹤點使能后打印。reg 和unreg可以根據實際情況置其中一個為NULL,也可以全部置為NULL。
詳細使用方法可以參考trace-events-sample.h。
審核編輯:劉清
-
cpu
+關注
關注
68文章
11049瀏覽量
216161 -
Trace
+關注
關注
0文章
19瀏覽量
10728 -
跟蹤器
+關注
關注
0文章
132瀏覽量
20399
原文標題:ftrace(二)新增tracepoint
文章出處:【微信號:嵌入式與Linux那些事,微信公眾號:嵌入式與Linux那些事】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
怎樣通過trace生成系統cpu的loading圖
heap_trace_init_tohost 的 sysviewtrace_proc解析錯誤如何解決?
Trace thickness
TRACE32多核策略
利用tracepoint梳理調度器框架及主要流程
勞特巴赫trace32使用介紹(一)

ThreadX(四)------TraceX使用

Ftrace使用tracefs文件系統保存控制文件
Trace功能的添加、組態及測試
Linux ftrace工具宏定義
如何對基于μTrace和Trace32的LPC86x進行邊界掃描

評論