Linux内核tracepoints
具體的可以參考kernel的文章,路徑如下:Documentation/trace里面的tracepoints.txt和tracepoint-analysis.txt。
這里簡要說明一下,舉一個小例子,怎么樣使用!
內核中的每個tracepoint提供一個鉤子來調用probe函數。一個tracepoint可以打開或關閉。打開時,probe函數關聯到tracepoint;關閉時,probe函數不關聯到tracepoint。tracepoint關閉時對kernel產生的影響很小,只是增加了極少的時間開銷(一個分支條件判斷),極小的空間開銷(一條函數調用語句和幾個數據結構)。當一個tracepoint打開時,用戶提供的probe函數在每次這個tracepoint執行是都會被調用。
如果用戶準備為kernel加入新的tracepoint,每個tracepoint必須以下列格式聲明:
#include <linux/tracepoint.h>DECLARE_TRACE(tracepoint_name,TPPROTO(trace_function_prototype),TPARGS(trace_function_args));上面的宏定義了一個新的tracepoint叫tracepoint_name。與這個tracepoint關聯的probe函數必須與TPPROTO宏定義的函數prototype一致,probe函數的參數列表必須與TPARGS宏定義的一致。
或許用一個例子來解釋會比較容易理解。Kernel里面已經包含了一些tracepoints,其中一個叫做sched_wakeup,這個tracepoint在每次scheduler喚醒一個進程時都會被調用。它是這樣定義的:
DECLARE_TRACE(sched_wakeup,TPPROTO(struct rq *rq, struct task_struct *p),TPARGS(rq, p))實際在kernel中插入這個tracepoint點的是一行如下代碼:
trace_sched_wakeup(rq, p);注意,插入tracepoint的函數名就是將trace_前綴添加到tracepoint_name的前面。除非有一個實際的probe函數關聯到這個tracepoint,trace_sched_wakeup()這個只是一個空函數。下面的操作就是將一個probe函數關聯到一個tracepoint:
void my_sched_wakeup_tracer(struct rq *rq, struct task_struct *p);register_trace_sched_wakeup(my_sched_wakeup_tracer);register_trace_sched_wakeup()函數實際上是DEFINE_TRACE()定義的,它把probe函數my_sched_wakeup_tracer()和tracepoint sched_wakeup關聯起來。
這樣就可以使用這個鉤子函數給我們做很多事情了!
轉載于:https://www.cnblogs.com/muahao/p/7999281.html
總結
以上是生活随笔為你收集整理的Linux内核tracepoints的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Flex组件的项目渲染器(ItemRen
- 下一篇: 如何为MySQL选择更合适的数据类型