日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

kprobe原理解析

發(fā)布時(shí)間:2023/12/13 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 kprobe原理解析 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

參考??http://www.cnblogs.com/honpey/p/4575928.html

?kprobe是linux內(nèi)核的一個(gè)重要特性,是一個(gè)輕量級(jí)的內(nèi)核調(diào)試工具,同時(shí)它又是其他一些更高級(jí)的內(nèi)核調(diào)試工具(比如perf和systemtap)的“基礎(chǔ)設(shè)施”,4.0版本的內(nèi)核中,強(qiáng)大的eBPF特性也寄生于kprobe之上,所以kprobe在內(nèi)核中的地位就可見(jiàn)一斑了。

kprobe是什么?

如何高效地調(diào)試內(nèi)核?printk是一種方法,但是printk終歸是毫無(wú)選擇地全量輸出,某些場(chǎng)景下不實(shí)用,于是你可以試一下tracepoint,我使能tracepoint機(jī)制的時(shí)候才輸出。對(duì)于傻傻地放置printk來(lái)輸出信息的方式,tracepoint是個(gè)進(jìn)步,但是tracepoint只是內(nèi)核在某些特定行為(比如進(jìn)程切換)上部署的一些靜態(tài)錨點(diǎn),這些錨點(diǎn)并不一定是你需要的,所以你仍然需要自己部署tracepoint,重新編譯內(nèi)核。那么kprobe的出現(xiàn)就很有必要了,它可以在運(yùn)行的內(nèi)核中動(dòng)態(tài)插入探測(cè)點(diǎn),執(zhí)行你預(yù)定義的操作。

kprobe怎么使用?

kprobe主要有兩種使用方法,一是通過(guò)模塊加載;二是通過(guò)debugfs接口。

模塊加載的方式:內(nèi)核源碼下有目錄下 samples/kprobes,該目錄下有許多kprobes的例子,可以仿照這些例子寫(xiě)自己的kprobe模塊。以kprobe_example.c為例,首先聲明一個(gè)kprobe結(jié)構(gòu)體,然后定義其中幾個(gè)關(guān)鍵成員變量,包括symbol_name,pre_handler,post_handler。其中,symbol_name是函數(shù)名(kprobe_example.c中該項(xiàng)為do_fork),告訴內(nèi)核我的探測(cè)點(diǎn)放置在了函數(shù)do_fork處,pre_hander和post_hander分別表示在執(zhí)行探測(cè)點(diǎn)之前和之后執(zhí)行的鉤子函數(shù)。然后通過(guò)register_kprobe函數(shù)注冊(cè)kprobe即可。將kprobe_example.ko inmod進(jìn)內(nèi)核之后,每當(dāng)系統(tǒng)新啟動(dòng)一個(gè)進(jìn)程,比如執(zhí)行l(wèi)s,cat等,都會(huì)輸出:

????????????? pre_hander: p->addr = 0x***, ip = ****.

????????????? post_handler: p->addr = 0x***, pc = ****.

第一行是執(zhí)行pre_handler鉤子函數(shù)的輸出,第二行是執(zhí)行post_handler鉤子函數(shù)的輸出,當(dāng)然這些都是內(nèi)核中案例的寫(xiě)法,你可以寫(xiě)自己的鉤子函數(shù)。

通過(guò)debugfs接口注冊(cè)kprobe:模塊加載的終究不是很方便,尤其對(duì)于一些不帶gcc的嵌入式系統(tǒng),需要交叉編譯ko,將ko拷貝到單板,然后insmod,不便。debugfs下(確切地說(shuō),應(yīng)該是ftrace)提供了一套注冊(cè)、使能、注銷(xiāo)kprobe的接口,可以很方便地操作kprobe。

用法如下:

  1) cd /sys/kernel/debug/tracing【有些系統(tǒng)沒(méi)有掛載debugfs,需要先掛載下 mount -t debugfs nodev /sys/kernel/debug】

  2)進(jìn)入到tracing目錄,這里就是傳說(shuō)中ftrace的天下了,執(zhí)行:

echo "p:sys_write_event sys_write" > kprobe_events

向kprobe_events寫(xiě)入"p:sys_write sys_write",注冊(cè)kprobe事件。你會(huì)發(fā)現(xiàn),當(dāng)前目錄下的events下,新增一個(gè)kprobes目錄,該目錄下:

root@station:/sys/kernel/debug/tracing/events/kprobes# lsenable filter sys_write_event

即,我們注冊(cè)的kprobe事件生效了。那么"p:sys_write_event sys_write"是什么意思呢?首先p表示我們要注冊(cè)一個(gè)kprobe,如果要注冊(cè)retprobe,此處應(yīng)為r;sys_write_event表示這個(gè)kprobe叫什么名字;sys_write表示我們的插入點(diǎn)在哪里。那么,“p:sys_write_event sys_write”的語(yǔ)義就很明顯了:在函數(shù)sys_write處插入一個(gè)kprobe點(diǎn),這個(gè)點(diǎn)的名字叫sys_write_event。

????? 3)使能kprobe。執(zhí)行:

cd /sys/kernel/debug/tracing/events/kprobes/events/sys_write_event echo 1 > enable cd ../../.. 【退回到/sys/kernel/debug/tracing,查看trace文件的輸出】 cat trace trace文件的輸出是如下的:.....bash-808 [003] d... 42715.347565: sys_write_event: (SyS_write+0x0/0xb0) ? ?解釋下置紅的這條輸出:pid為808的進(jìn)程bash,在自本次開(kāi)機(jī)42715.345565秒的時(shí)候,調(diào)用了一次函數(shù)sys_write。.....

? 4)撤消kprobe。執(zhí)行:

cd /sys/kernel/debug/tracing/events/kprobes/events/sys_write_event echo 0 > enable【首先先關(guān)閉kprobe】 cd ../../.. echo "-:kprobes/sys_write_event" >> kprobe_events 【注銷(xiāo)kprobe】

以上就是kprobe的兩種注冊(cè)及使用方式:通過(guò)模塊加載以及通過(guò)debugfs注冊(cè)。這兩種使用方法有什么聯(lián)系?

使用模塊加載的方式,是kprobe的一種原始用法:在kprobe結(jié)構(gòu)體里定義插入點(diǎn)、鉤子函數(shù),然后通過(guò)register_kprobe注冊(cè)上這個(gè)kprobe即可。ftrace接口是kprobe的一種應(yīng)用,它是一套trace的框架,下面的trace機(jī)制包括tracepoint、function trace等,kprobe僅僅是這些trace機(jī)制中的一員。上面的講述我們也已經(jīng)看出來(lái)了,通過(guò)ftrace注冊(cè)的kprobe的輸出是在ftrace的輸出:trace文件。模塊加載模式中我們可以自定義kprobe的鉤子函數(shù)pre_handler和post_handler,但是在ftrace下注冊(cè)的kprobe的鉤子是ftrace接口默認(rèn)的,我們?cè)O(shè)置不了,但是具體輸出什么,我們可以在echo “p:sys_write_event sys_write"時(shí)指定,比如指定x1寄存器的內(nèi)容等,所以ftrace下注冊(cè)的kprobe功能同樣很強(qiáng)大。同時(shí),由于ftrace下kprobe的輸出基于ftrace的輸出框架,所以輸出信息包含當(dāng)前進(jìn)程、CPU、時(shí)間戳等信息,對(duì)于trace來(lái)說(shuō)非常有用。

高級(jí)用法可以參看內(nèi)核文檔:kprobes.txt 以及 kprobetrace.txt。

?

轉(zhuǎn)載于:https://www.cnblogs.com/xingmuxin/p/8984043.html

總結(jié)

以上是生活随笔為你收集整理的kprobe原理解析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。