5 Kprobe && systemtap
5.1 內(nèi)核kprobe機制
kprobe
是 linux
內(nèi)核的一個重要特性, 是一個輕量級的內(nèi)核調(diào)試工具, 同時它又是其他一些更高級的內(nèi)核調(diào)試工具(比如 perf
和 systemtap
)的 “基礎(chǔ)設(shè)施”, 4.0版本的內(nèi)核中, 強大的 eBPF
特性也寄生于 kprobe
之上, 所以 kprobe
在內(nèi)核中的地位就可見一斑了.
Kprobes
提供了一個強行進入任何內(nèi)核例程并從中斷處理器無干擾地收集信息的接口. 使用 Kprobes
可以收集處理器寄存器和全局數(shù)據(jù)結(jié)構(gòu)等調(diào)試信息。開發(fā)者甚至可以使用 Kprobes
來修改 寄存器值和全局數(shù)據(jù)結(jié)構(gòu)的值.
如何高效地調(diào)試內(nèi)核?
printk
是一種方法, 但是 printk
終歸是毫無選擇地全量輸出, 某些場景下不實用, 于是你可以試一下tracepoint
, 我使能 tracepoint
機制的時候才輸出. 對于傻傻地放置 printk
來輸出信息的方式,tracepoint
是個進步, 但是 tracepoint
只是內(nèi)核在某些特定行為(比如進程切換)上部署的一些靜態(tài)錨點, 這些錨點并不一定是你需要的, 所以你仍然需要自己部署tracepoint
, 重新編譯內(nèi)核. 那么kprobe
的出現(xiàn)就很有必要了, 它可以在運行的內(nèi)核中動態(tài)插入探測點, 執(zhí)行你預定義的操作.
它的基本工作機制是 : 用戶指定一個探測點, 并把一個用戶定義的處理函數(shù)關(guān)聯(lián)到該探測點, 當內(nèi)核執(zhí)行到該探測點時, 相應的關(guān)聯(lián)函數(shù)被執(zhí)行,然后繼續(xù)執(zhí)行正常的代碼路徑.
kprobe
實現(xiàn)了三種類型的探測點 : kprobes
, jprobes
和 kretprobes
(也叫返回探測點). kprobes
是可以被插入到內(nèi)核的任何指令位置的探測點, jprobes
則只能被插入到一個內(nèi)核函數(shù)的入口, 而 kretprobes
則是在指定的內(nèi)核函數(shù)返回時才被執(zhí)行.
相關(guān)資料鏈接:
kprobe工作原理:http://blog.itpub.net/15480802/viewspace-1162094/
隨想錄(強大的kprobe):http://blog.csdn.net/feixiaoxing/article/details/40351811
kprobe原理解析(一):http://www.cnblogs.com/honpey/p/4575928.html
5.2 前端工具systemtap
SystemTap
是監(jiān)控和跟蹤運行中的 Linux
內(nèi)核的操作的動態(tài)方法. 這句話的關(guān)鍵詞是動態(tài), 因為 SystemTap
沒有使用工具構(gòu)建一個特殊的內(nèi)核, 而是允許您在運行時動態(tài)地安裝該工具. 它通過一個Kprobes
的應用編程接口 (API
) 來實現(xiàn)該目的.
SystemTap
與一種名為 DTrace
的老技術(shù)相似,該技術(shù)源于 Sun Solaris
操作系統(tǒng). 在 DTrace
中, 開發(fā)人員可以用 D
編程語言(C
語言的子集, 但修改為支持跟蹤行為)編寫腳本. DTrace
腳本包含許多探針和相關(guān)聯(lián)的操作, 這些操作在探針 “觸發(fā)” 時發(fā)生. 例如, 探針可以表示簡單的系統(tǒng)調(diào)用,也可以表示更加復雜的交互,比如執(zhí)行特定的代碼行
DTrace
是 Solaris
最引人注目的部分, 所以在其他操作系統(tǒng)中開發(fā)它并不奇怪. DTrace
是在 Common Development and Distribution License (CDDL)
之下發(fā)行的, 并且被移植到 FreeBSD
操作系統(tǒng)中.
另一個非常有用的內(nèi)核跟蹤工具是 ProbeVue
, 它是 IBM
為 IBM? AIX?
操作系統(tǒng) 6.1
開發(fā)的. 您可以使用 ProbeVue
探查系統(tǒng)的行為和性能, 以及提供特定進程的詳細信息. 這個工具使用一個標準的內(nèi)核以動態(tài)的方式進行跟蹤.
考慮到 DTrace
和 ProbeVue
在各自的操作系統(tǒng)中的巨大作用, 為 Linux
操作系統(tǒng)策劃一個實現(xiàn)該功能的開源項目是勢不可擋的. SystemTap
從 2005
年開始開發(fā), 它提供與 DTrace
和 ProbeVue
類似的功能. 許多社區(qū)還進一步完善了它, 包括 Red Hat
、Intel
、Hitachi
和 IBM
等.
這些解決方案在功能上都是類似的, 在觸發(fā)探針時使用探針和相關(guān)聯(lián)的操作腳本.
相關(guān)資料鏈接:
SystemTap 學習筆記 - 安裝篇:https://segmentfault.com/a/1190000000671438
Linux 自檢和 SystemTap 用于動態(tài)內(nèi)核分析的接口和語言:https://www.ibm.com/developerworks/cn/linux/l-systemtap/
Brendan’s blog Using SystemTap:http://dtrace.org/blogs/brendan/2011/10/15/using-systemtap/
內(nèi)核調(diào)試神器SystemTap — 簡介與使用(一):http://blog.csdn.net/zhangskd/article/details/25708441
內(nèi)核探測工具systemtap簡介:http://www.cnblogs.com/hazir/p/systemtap_introduction.html
SystemTap Beginner:http://blog.csdn.net/kafeiflynn/article/details/6429976
使用systemtap調(diào)試linux內(nèi)核:http://blog.csdn.net/heli007/article/details/7187748
Ubuntu Kernel Debuginfo:http://ddebs.ubuntu.com/pool/main/l/linux
Linux 下的一個全新的性能測量和調(diào)式診斷工具 Systemtap, 第 3 部分: Systemtap:https://www.ibm.com/developerworks/cn/linux/l-cn-systemtap3/
6 kgdb && kgtp
6.1 kgdb
- KDB 和 KGDB 合并, 并進入內(nèi)核
KGDB
是大名鼎鼎的內(nèi)核調(diào)試工具, 他是由 KDB
和 KGDB
項目合并而來.
kdb
是一個Linux系統(tǒng)的內(nèi)核調(diào)試器, 它是由SGI公司開發(fā)的遵循GPL許可證的開放源碼調(diào)試工具. kdb
嵌入在Linux
內(nèi)核中. 為內(nèi)核&&驅(qū)動程序員提供調(diào)試手段. 它適合于調(diào)試內(nèi)核空間的程序代碼. 譬如進行設(shè)備驅(qū)動程序調(diào)試. 內(nèi)核模塊的調(diào)試等.
kgdb
和 kdb
現(xiàn)在已經(jīng)合并了. 對于一個正在運行的kgdb
而言, 可以使用 gdbmonitor
命令來使用 kdb
命令. 比如
(gdb)gdb monitor ps -A
就可以運行 kdb
的 ps
命令了.
分析一下 kdb
補丁和合入主線的 kdb
有啥不同
kdb
跟 kgdb
合并之后, 也可以使用 kgdb
的IO
驅(qū)動(比如鍵盤), 但是同時也 kdb
也喪失了一些功能.合并之后的kdb
不在支持匯編級的源碼調(diào)試. 因此它現(xiàn)在也是平臺獨立的.
- kdump和kexec已經(jīng)被移除。
- 從/proc/meninfo中獲取的信息比以前少了。
- bt命令現(xiàn)在使用的是內(nèi)核的backtracer,而不是kdb原來使用的反匯編。
- 合并之后的kdb不在具有原來的反匯編(id命令)
總結(jié)一下 : kdb
和 kgdb
合并之后,系統(tǒng)中對這兩種調(diào)試方式幾乎沒有了明顯的界限,比如通過串口進行遠程訪問的時候,可以使用 kgdb
命令, 也可以使用 kdb
命令(使用gdb monitor實現(xiàn))
6.2 KGTP
KGTP
是一個 實時 輕量級 Linux
調(diào)試器 和 跟蹤器. 使用 KGTP
使用 KGTP
不需要在 Linux
內(nèi)核上打 PATCH
或者重新編譯, 只要編譯KGTP模塊并 insmod
就可以.
其讓 Linux
內(nèi)核提供一個遠程 GDB
調(diào)試接口, 于是在本地或者遠程的主機上的GDB可以在不需要停止內(nèi)核的情況下用 GDB tracepoint
和其他一些功能 調(diào)試 和 跟蹤 Linux
.
即使板子上沒有 GDB
而且其沒有可用的遠程接口, KGTP
也可以用離線調(diào)試的功能調(diào)試內(nèi)核(見http://code.google.com/p/kgtp/wiki/HOWTOCN#/sys/kernel/debug/gtpframe和離線調(diào)試)。
KGTP支持 X86-32 , X86-64 , MIPS 和 ARM 。
KGTP在Linux內(nèi)核 2.6.18到upstream 上都被測試過。
而且還可以用在 Android 上(見 http://code.google.com/p/kgtp/wiki/HowToUseKGTPinAndroid)
相關(guān)資料鏈接:
github-KGTP:https://github.com/teawater/kgtp
KGTP內(nèi)核調(diào)試使用:http://blog.csdn.net/djinglan/article/details/15335653
KGTP中增加對GDB命令“set trace-buffer-size”的支持 - Week 5:http://blog.csdn.net/calmdownba/article/details/38659317
7 perf
Perf
是用來進行軟件性能分析的工具。
通過它, 應用程序可以利用 PMU
, tracepoint
和內(nèi)核中的特殊計數(shù)器來進行性能統(tǒng)計. 它不但可以分析指定應用程序的性能問題 (per thread
). 也可以用來分析內(nèi)核的性能問題, 當然也可以同時分析應用代碼和內(nèi)核,從而全面理解應用程序中的性能瓶頸.
最初的時候, 它叫做 Performance counter
, 在 2.6.31
中第一次亮相. 此后他成為內(nèi)核開發(fā)最為活躍的一個領(lǐng)域. 在 2.6.32
中它正式改名為 Performance Event
, 因為 perf
已不再僅僅作為 PMU
的抽象, 而是能夠處理所有的性能相關(guān)的事件.
使用 perf
, 您可以分析程序運行期間發(fā)生的硬件事件,比如 instructions retired
, processor clock cycles
等; 您也可以分析軟件事件, 比如 Page Fault
和進程切換。
這使得 Perf
擁有了眾多的性能分析能力, 舉例來說,使用 Perf
可以計算每個時鐘周期內(nèi)的指令數(shù), 稱為 IPC
, IPC
偏低表明代碼沒有很好地利用 CPU
.
Perf
還可以對程序進行函數(shù)級別的采樣, 從而了解程序的性能瓶頸究竟在哪里等等. Perf
還可以替代 strace
, 可以添加動態(tài)內(nèi)核 probe
點. 還可以做 benchmark
衡量調(diào)度器的好壞.
人們或許會稱它為進行性能分析的”瑞士軍刀”, 但我不喜歡這個比喻, 我覺得 perf
應該是一把世間少有的倚天劍.
金庸筆下的很多人都有對寶刀的癖好, 即便本領(lǐng)低微不配擁有, 但是喜歡, 便無可奈何. 我恐怕正如這些人一樣, 因此進了酒館客棧, 見到相熟或者不相熟的人, 就要興沖沖地要講講那倚天劍的故事.
相關(guān)資料鏈接:
Perf – Linux下的系統(tǒng)性能調(diào)優(yōu)工具,第 1 部分:https://www.ibm.com/developerworks/cn/linux/l-cn-perf1/index.html
perf Examples:http://www.brendangregg.com/perf.html
改進版的perf, Performance analysis tools based on Linux perf_events (aka perf) and ftrace:https://github.com/brendangregg/perf-tools
Perf使用教程:http://blog.chinaunix.net/uid-10540984-id-3854969.html
linux下的內(nèi)核測試工具——perf使用簡介:http://blog.csdn.net/trochiluses/article/details/10261339
perf 移植:http://www.cnblogs.com/helloworldtoyou/p/5585152.html
8 其他Tracer工具
8.1 LTTng
LTTng
是一個 Linux
平臺開源的跟蹤工具, 是一套軟件組件, 可允許跟蹤 Linux
內(nèi)核和用戶程序, 并控制跟蹤會話(開始/停止跟蹤、啟動/停止事件 等等). 這些組件被綁定如下三個包 :
相關(guān)資料鏈接:
Linux 平臺開源的跟蹤工具:LTTng:http://www.open-open.com/lib/view/open1413946397247.html
用 lttng 跟蹤內(nèi)核:http://blog.csdn.net/xsckernel/article/details/17794551
LTTng and LTTng project:http://blog.csdn.net/ganggexiongqi/article/details/6664331
8.2 eBPF
extended Berkeley Packet Filter(eBPF)是一個可以在事件上運行程序的高效內(nèi)核虛擬機(JIT)。它可能最終會提供 ftrace 和 perf_events 的內(nèi)核編程,并強化其他的 tracer。這是 Alexei Starovoitov 目前正在開發(fā)的,還沒有完全集成,但是從4.1開始已經(jīng)對一些優(yōu)秀的工具有足夠的內(nèi)核支持了,如塊設(shè)備I/O的延遲熱圖。可參考其主要作者 Alexei Starovoitov 的BPF slides和eBPF samples。
8.3 Ktap
ktap 在過去是一款前景很好的 tracer,它使用內(nèi)核中的 lua 虛擬機處理,在沒有調(diào)試信息的情況下在嵌入式設(shè)備上運行的很好。它分為幾個步驟,并在有一段時間似乎超過了 Linux 上所有的追蹤器。然后 eBPF 開始進行內(nèi)核集成,而 ktap 的集成在它可以使用 eBPF 替代它自己的虛擬機后才開始。因為 eBPF 仍將持續(xù)集成幾個月,ktap 開發(fā)者要繼續(xù)等上一段時間。我希??今年晚些時候它能重新開發(fā)。
8.4 dtrace4linux
dtrace4linux 主要是 Paul Fox 一個人在業(yè)余時間完成的,它是 Sun DTrace 的 Linux 版本。它引入矚目,還有一些 provider 可以運行,但是從某種程度上來說還不完整,更多的是一種實驗性的工具(不安全)。我認為,顧忌到許可問題,人們會小心翼翼的為 dtrace4linux 貢獻代碼:由于當年 Sun 開源DTrace 使用的是 CDDL 協(xié)議,而 dtrace4linux 也不大可能最終進入 Linux kernel。Paul 的方法很可能會使其成為一個 add-on。我很樂意看到 Linux 平臺上的 DTrace 和這個項目的完成,我認為當我加入 Netflix 后將會花些時間來協(xié)助完成這個項目。然而,我還是要繼續(xù)使用內(nèi)置的 tracers,如 ftrace 和 perf_events。
8.5 OL DTrace
Oracle Linux DTrace為了將 DTrace 引入 Linux,特別是 Oracle Linux,做出了很大的努力。這些年來發(fā)布的多個版本表明了它的穩(wěn)定進展。開發(fā)者們以一種對這個項目的前景看好的態(tài)度談論著改進 DTrace 測試套件。很多有用的 provider 已經(jīng)完成了,如:syscall, profile, sdt, proc, sched 以及USDT。我很期待 fbt(function boundary tracing, 用于內(nèi)核動態(tài)跟蹤)的完成,它是 Linux 內(nèi)核上非常棒的 provider。OL DTrace 最終的成功將取決于人們對運行 Oracle Linux(為技術(shù)支持付費)有多大興趣,另一方面取決于它是否完全開源:它的內(nèi)核元件是開源的,而我沒有看到它的用戶級別代碼。
8.6 sysdig
sysdig是一個使用類tcpdump語法來操作系統(tǒng)事件的新tracer,它使用lua提交進程。它很優(yōu)秀,它見證了系統(tǒng)跟蹤領(lǐng)域的變革。它的局限性在于它只在當前進行系統(tǒng)調(diào)用,在提交進行時將所有事件轉(zhuǎn)儲為用戶級別。你可以使用系統(tǒng)調(diào)用做很多事情,然而我還是很希望它能支持跟蹤點、kprobe和uprobe。我還期待它能支持eBPF做內(nèi)核摘要。目前,sysdig開發(fā)者正在增加容器支持。留意這些內(nèi)容。
原文作者:CHENG Jian 原文鏈接:https://kernel.blog.csdn.net/article/details/68948080
-
內(nèi)核
+關(guān)注
關(guān)注
3文章
1416瀏覽量
41360 -
Linux
+關(guān)注
關(guān)注
87文章
11508瀏覽量
213567 -
開發(fā)
+關(guān)注
關(guān)注
0文章
373瀏覽量
41490
發(fā)布評論請先 登錄
Linux內(nèi)核開發(fā)工具介紹

Linux內(nèi)核鏡像bzImage和rootfs的制作、安裝及調(diào)試過程

Linux內(nèi)核學習筆記:printk調(diào)試
請問linux內(nèi)核怎么調(diào)試?
學會Linux內(nèi)核調(diào)試方法!
快速理解什么是Linux內(nèi)核以及Linux內(nèi)核的內(nèi)容

嵌入式LINUX系統(tǒng)內(nèi)核和內(nèi)核模塊調(diào)試教程

嵌入式LINUX系統(tǒng)內(nèi)核和內(nèi)核模塊調(diào)試

Linux內(nèi)核調(diào)試的方式以及工具集錦
Linux內(nèi)核調(diào)試的方式以及工具匯總(上)

Linux內(nèi)核調(diào)試方式以及工具總結(jié)

評論