Code Debug and Inject

分類: LINUX

歡迎轉載,轉載請保留文檔完整性!

From:http://blog.chinaunix.net/uid-20662820-id-3799149.html

 

Code Debug and Inject

Author: Tony [email protected]

Date:2013711日星期四

 

1.   Debug

Linux下較新的內核調試是Kprobe,應用層框架是PtraceUtracegdb正是基於ptrace實現。

由於應用層程序可能不在內存中,而且可能存在一個程序多次執行的情況,所有內核層的調試不能直接調試應用層程序。

2.   Kprobe

2.1.    About kprobe

Kprobe機制是內核提供的一種調試機制,它提供了一種方法,能夠在不修改現有代碼的基礎上,靈活的跟蹤內核函數的執行。kprobe已經被Linus納入主樹,只需要內核選項“CONFIG_KPROBES=y”就可以開啓kprobe功能。

Kprobe提供了三種形式的探測點,一種是最基本的kprobe,能夠在指定代碼執行前、執行後進行探測,但此時不能訪問被探測函數內的相關變量信息;一種是jprobe,用於探測某一函數的入口,並且能夠訪問對應的函數參數;一種是kretprobe,用於完成指定函數返回值的探測功能。其中最基本的就是kprobe機制,jprobe以及kretprobe的實現都依賴於kprobe

2.2.    How kprobe works?

對於kprobe功能的實現主要利用了兩個功能特性:trapx86/x64下是int 3),單步執行(EFLAGS中的TF標誌)。

kprobe功能初始化時會註冊到die_notifier通知鏈,該通知鏈在trapdebug異常的時候被調用,從而使得kprobe可以感知trapdebug異常。

通過kprobe查看探測點的大概的流程:

 1)註冊探測點

kprobe會對被探測地址的指令碼進行替換,替換爲int 3trap)的指令碼,並將原有地址和指令碼保存。同時會保存用戶希望在探測點執行的代碼pre_handler(指令碼)。

 2)內核執行到探測點

由於探測點的指令碼被修改爲trap,觸發trap異常。通過do_int3-->notify_die調用到kprobe的回調函數。

 3)在kprobe回調函數中處理trap異常

kprobe根據寄存器中RIP(x64),計算出觸發異常的RIP(寄存器RIP中存放着觸發異常的下一條指令的地址)。

kprobe根據計算出的RIP與第一步中保存的地址相比較,判斷是否是探測點。

執行第一步中保存的pre_handler

 4)執行原有的指令

通過設置EFLAGS中的TF標誌位,進入單步調試模式,並且把異常返回的地址修改爲第一步中保存的原指令碼;

 5)回覆執行流程

因爲進入單步調試模式,原有指令碼執行完成後,會觸發DEBUG。通過do_debug-->notify_die調用到kprobe的回調函數。

 6)在kprobe中恢復原有執行流程

kprobe修改RIP中保存的異常返回的指令地址爲第一步中保存的指令地址的下一條地址。DEBUG異常返回後,調整到RIP中執行,原有流程恢復。

2.3.    How kretprobe works?

kretprobe利用kprobe實現,可以在函數返回之前添加要執行的代碼。kretprobe的大概流程:

         1)在調用函數的call指令後添加kprobe

         2kprobe的回調函數會記錄下call指令保存的函數返回的return地址,並將該地址替換爲一個特殊的“trampoline”。

         3kprobetrampoline地址上註冊kprobe,該kprobe會調用用戶定義的代碼。

         4)當函數返回時,會執行“trampoline”,從而運行之前註冊的用戶定義代碼。

3.   Utrace

3.1.    About Utrace

UtraceRed HatRoland McGrath編寫,是 Linux內核中最新的 trace debug基礎構架。正如其名稱所暗示,utrace爲運行在用戶態的進程提供 trace debug支持。

Utrace2007年第一次提交到內核郵件列表,但是由於Linus的強烈反對(http://yarchive.net/comp/linux/utrace.html),目前Utrace仍然只在-mm分支,並不在Mainline。用戶要想適應utrace,需要自己給內核打patch

關於Utrace的介紹可以參考http://www.ibm.com/developerworks/cn/linux/l-cn-utrace/

4.   Systemtap

4.1.    About Systemtap

SystemTapprovides free software (GPL) infrastructure to simplify the gathering ofinformation about the running Linux system. This assists diagnosis of aperformance or functional problem. SystemTap eliminates the need for thedeveloper to go through the tedious and disruptive instrument, recompile,install, and reboot sequence that may be otherwise required to collect data.

SystemTapprovides a simple command line interface and scripting language for writinginstrumentation for a live running kernel plus user-spaceapplications. We are publishing samples, as well as enlarging the internal"tapset" script library to aid reuse and abstraction.

Amongother tracing/probing tools, SystemTap is the tool of choice for complex tasksthat may require live analysis, programmable on-line response, and whole-systemsymbolic access. SystemTap can also handle simple tracing jobs.

Currentproject members include Red Hat, IBM, Hitachi, and Oracle.( http://sourceware.org/systemtap/)

4.2.    How Systemtap works?

KprobeUtrace提供了內核態和用戶態探測函數的接口,用戶可以直接編寫內核模塊來實現debug/inject。鑑於內核模塊的編寫需要較高的門檻,Systemtap通過提供一個框架,只需要用戶編寫腳本就可以實現debug/inject

用戶需要編寫systemtap腳本,然後systemtap框架將腳本轉換成內核C代碼,編譯成內核模塊,實現代碼的debug/inject

5.   DemoSLES11SP2

5.1.    Prepare

5.1.1.     Kernel Utrace

SLES11SP2已經應用了utrace patch,但是默認內核沒有開啓。修改開啓UTRACE選項,重新編譯內核

5.1.2.     Systemtap

zypperinstall systemtap

5.1.3.     Glibc debuginfo

如果需要debug/inject glibc庫,需要安裝對於的debuginfo安裝包。

zypperca

zypper mr-e SLE11-SP2-Debuginfo-Core

zyppermr -e SLE11-SP2-Debuginfo-Updates

rpm -qiglibc

zypperinstall glibc-debuginfo-2.11.3-17.31.1(這裏需要確保安裝的debuginfo的版本與系統glibc版本完全一致)

5.2.    Coding program which will be injectd


5.3.    Systemtap scripts


5.4.    Run program


5.5.    Inject program


6.   What we can do with it?

PerformanceTuning

Debugkernel

Debugapplication

Injectrunning program

Injectlibray

……

7.   Appendix

7.1.    Per event performance

發佈了1 篇原創文章 · 獲贊 2 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章