kprobe原理解析

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

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

kprobe是什么?

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

kprobe怎么使用?

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

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

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

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

第一行是執行pre_handler鉤子函數的輸出,第二行是執行post_handler鉤子函數的輸出,當然這些都是內核中案例的寫法,你可以寫自己的鉤子函數。

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

用法如下:

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

  2)進入到tracing目錄,這里就是傳說中ftrace的天下了,執行:

echo "p:sys_write_event sys_write" > kprobe_events    

向kprobe_events寫入"p:sys_write sys_write",注冊kprobe事件。你會發現,當前目錄下的events下,新增一個kprobes目錄,該目錄下:

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

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

????? 3)使能kprobe。執行:

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的進程bash,在自本次開機42715.345565秒的時候,調用了一次函數sys_write。.....

? 4)撤消kprobe。執行:

cd /sys/kernel/debug/tracing/events/kprobes/events/sys_write_event
echo 0 > enable【首先先關閉kprobe】
cd ../../..
echo "-:kprobes/sys_write_event" >> kprobe_events 【注銷kprobe】

以上就是kprobe的兩種注冊及使用方式:通過模塊加載以及通過debugfs注冊。這兩種使用方法有什么聯系?

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

高級用法可以參看內核文檔:kprobes.txt 以及 kprobetrace.txt。

?

轉載于:https://www.cnblogs.com/xingmuxin/p/8984043.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/250365.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/250365.shtml
英文地址,請注明出處:http://en.pswp.cn/news/250365.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

02 數據類型

轉載于:https://www.cnblogs.com/theoup/p/9875293.html

css --- [學習筆記]背景圖片小結 css三大特性

源代碼 參考 1. 行高(line-height) 目標 理解 - 能說出行高和高度三種關系 - 能簡單理解為什么行高等于單行文字會垂直居應用 使用行高實現單行文字垂直居中能會測量行高 2. CSS 背景(background) 目標 理解 - 背景的作用css 背景圖片和插入圖片的區別 應用 通過 css 背景…

(數據科學學習手札30)樸素貝葉斯分類器的原理詳解Python與R實現

一、簡介 要介紹樸素貝葉斯(naive bayes)分類器,就不得不先介紹貝葉斯決策論的相關理論: 貝葉斯決策論(bayesian decision theory)是概率框架下實施決策的基本方法。對分類任務來說,在所有相關概…

【技術累積】【點】【java】【29】MapUtils

內容 是Apache組織下的commons-collections包中的工具類<dependency><groupId>commons-collections</groupId><artifactId>commons-collections</artifactId><version>3.2.1</version></dependency> Map操作相關的&#xff0c…

css --- [讀書筆記] 盒模型(邊框、內外邊距)

說明 源代碼學習 盒子模型(css重點) css學習三大重點: css盒子模型、 浮動、 定位 目標: 能說出盒子模型由哪四部分組成: 內容、邊框、內外邊距能說出內邊距的作用,設置不同數值分別代表的意思: 控制內部塊級元素和寬框的距離能說出塊級盒子居中對齊需要的2個條件能說出外邊…

Java 泛型,你了解類型擦除嗎?

泛型&#xff0c;一個孤獨的守門者。大家可能會有疑問&#xff0c;我為什么叫做泛型是一個守門者。這其實是我個人的看法而已&#xff0c;我的意思是說泛型沒有其看起來那么深不可測&#xff0c;它并不神秘與神奇。泛型是 Java 中一個很小巧的概念&#xff0c;但同時也是一個很…

css --- [讀書筆記] 浮動(float) 與 清除浮動

說明 源代碼學習 1. 浮動 1.1 CSS布局的三種機制 網頁布局的核心 — 利用 CSS 來擺放盒子 CSS提供了3種機制來設置盒子的擺放位置: 標準流、浮動和定位. 標準流: 塊級元素(div、hr、p、h1~h6、ul、ol、dl、form、table)會獨占一行,從上向下順序排列行內元素(span、a、i、em)…

Shiro身份認證---轉

目錄1.Shro的概念2.Shiro的簡單身份認證實現3.Shiro與spring對身份認證的實現前言&#xff1a; Shiro 可以非常容易的開發出足夠好的應用&#xff0c;其不僅可以用在 JavaSE 環境&#xff0c;也可以用在 JavaEE 環境。Shiro 可以幫助我們完成&#xff1a;認證、授權、加密、會話…

模板 Trie樹

模板 Trie樹 code&#xff1a; #include <iostream> #include <cstdio>using namespace std;const int wx20017;inline int read(){int sum0,f1; char chgetchar();while(ch<0||ch>9){if(ch-)f-1; chgetchar();}while(ch>0&&ch<9){sum(sum<…

css --- [練手小項目]樣式小結(字體、顏色的語義 清除浮動的使用)

說明 源代碼 1.1 CSS屬性書寫順序(重點) 建議遵循以下順序: 1.布局定位屬性: display / position / float / clear / visibility / overflow (建議display第一個寫, 畢竟關系到模式) 2.自身屬性: width / height / margin / padding / border / background 3.文本屬性: co…

《Hive編程指南》14.3 投影變換的實踐出錯原因分析

自己在學習14.3節投影變換執行SQL語句hive (default)> SELECT TRANSFORM(col1, col2) USING /bin/cut -f1 AS newA, newB FROM a;時出現了這個錯誤 Ended Job job_local1231989520_0004 with errors Error during job, obtaining debugging information... FAILED: Executi…

鏈式前向星(轉)

轉自大佬博客https://blog.csdn.net/ACdreamers/article/details/16902023 我們首先來看一下什么是前向星. 前向星是一種特殊的邊集數組,我們把邊集數組中的每一條邊按照起點從小到大排序,如果起點相同就按照終點從小到大排序, 并記錄下以某個點為起點的所有邊在數組中的起始位…

javascript --- [FormData的使用] 表單元素轉換成表單 對象二進制文件上傳

1. FormData的作用 1.1 將Form表單元素,轉換成表單對象 在使用Ajax進行表單提交的時候,采用原生的js獲取dom,然后添加屬性.當表單項很多的時候,代碼會很多.不利于后期閱讀、維護. 這時,可以使用FormData對象,將HTML中的表單元素轉換成表單對象,如下: <!-- 表單對象 -->…

android studio gradle 國內代理

使用阿里云的國內鏡像倉庫地址&#xff0c;就可以快速的下載需要的文件 修改項目根目錄下的文件 build.gradle &#xff1a; buildscript { repositories { maven{ url http://maven.aliyun.com/nexus/content/groups/public/} } } allprojects { …

爬蟲—01-爬蟲原理與數據抓取

爬蟲的更多用途 12306搶票 網站上的頭票 短信轟炸關于Python網絡爬蟲&#xff0c;我們需要學習的有&#xff1a; Python基礎語法學習&#xff08;基礎知識&#xff09;對HTML頁面的內容抓取&#xff08;數據抓取&#xff09;對HTML頁面的數據提取&#xff08;數據提取&#xff…

javascript --- [FormData的使用] 文件上傳進度條展示 文件上傳圖片即使預覽

1. 準備工作 因為要發送Ajax請求,而Ajax技術的運行需要網站環境,因此其中一個解決方案是,將頁面作為網站的靜態資源暴露出來,然后通過瀏覽器進行訪問. 1.1 靜態資源 使用express將public下面的資源暴露出來在根目錄下面新建一個public文件夾和一個app.js文件 // app.js con…

2018年春閱讀計劃---閱讀筆記4

uml圖的幾大特點&#xff1a;容易掌握 2.面向對象 3.可視化&#xff0c;表達能力強大 4.容易掌握使用 5.與編程語言的關系。用c&#xff0c;java等編程語言可以實現一個系統&#xff0c;支持uml 的一些工具&#xff0c;可以根據uml所建立的系統模型自動產生代碼框架。 uml的5類…

TP5之安全機制

防止sql注入 1、查詢條件盡量使用數組方式&#xff0c;具體如下&#xff1a; 1 $wheres array(); 2 3 $wheres[account] $account; 4 5 $wheres[password] $password; 6 7 $User->where($wheres)->find(); 2、如果必須使用字符串&#xff0c;建議使用預處理機制&am…

javascript --- [jsonp] script標簽的妙用(繞過同源限制)

1. 同源 1.1 什么是同源 協議、域名、端口號相同 1.2 為什么有同源政策 同源政策是為了保護用戶信息的安全,放置惡意的網站竊取數據。最初的同源政策是指A網站再客戶端設置的Cookie,B網站是不能訪問的. 隨著互聯網的發展,同源政策也越來越嚴格,在不同源的情況下,其中有一項…

SQL登錄報錯

在安裝完SQL后&#xff0c;發現報出了error40和53的錯誤&#xff0c;作為小白的我也是一臉懵逼&#xff0c;明明一切都是按照默認加下一步安裝的&#xff0c;為什么到了連接數據庫的時候就出現了問題呢&#xff1f; 后來經過調查&#xff0c;發現需要將sql配置管理的ip中的一項…