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