Linux 內核的經典調試方式
1 內核調試以及工具總結
內核總是那麼捉摸不透, 內核也會犯錯, 但是調試卻不能像用戶空間程序那樣, 爲此內核開發者爲我們提供了一系列的工具和系統來支持內核的調試.
內核的調試, 其本質是內核空間與用戶空間的數據交換, 內核開發者們提供了多樣的形式來完成這一功能.
2 用戶空間與內核空間數據交換的文件系統
內核中有三個常用的僞文件系統: procfs, debugfs 和 sysfs.
它們都用於 Linux 內核和用戶空間的數據交換, 但是適用的場景有所差異:
-
procfs
歷史最早, 最初就是用來跟內核交互的唯一方式, 用來獲取處理器、內存、設備驅動、進程等各種信息. -
sysfs
跟kobject
框架緊密聯繫, 而kobject
是爲設備驅動模型而存在的, 所以sysfs
是爲設備驅動服務的. -
debugfs
從名字來看就是爲debug
而生, 所以更加靈活. -
relayfs
是一個快速的轉發(relay)
數據的文件系統, 它以其功能而得名. 它爲那些需要從內核空間轉發大量數據到用戶空間的工具和應用提供了快速有效的轉發機制.
相關資料鏈接:
在 Linux 下用戶空間與內核空間數據交換的方式, 第 2 部分: procfs、seq_file、debugfs 和 relayfs:http://www.ibm.com/developerworks/cn/linux/l-kerns-usrs2/
Linux 文件系統:procfs, sysfs, debugfs 用法簡介:http://www.tinylab.org/show-the-usage-of-procfs-sysfs-debugfs/
2.1 procfs 文件系統
ProcFs
介紹
procfs
是比較老的一種用戶態與內核態的數據交換方式, 內核的很多數據都是通過這種方式出口給用戶的, 內核的很多參數也是通過這種方式來讓用戶方便設置的. 除了 sysctl
出口到 /proc
下的參數, procfs
提供的大部分內核參數是隻讀的. 實際上, 很多應用嚴重地依賴於 procfs, 因此它幾乎是必不可少的組件. 前面部分的幾個例子實際上已經使用它來出口內核數據, 但是並沒有講解如何使用, 本節將講解如何使用procfs
.
-
參考資料:
用戶空間與內核空間數據交換的方式 (2)——procfs:http://www.cnblogs.com/hoys/archive/2011/04/10/2011141.html
2.2 sysfs 文件系統
內核子系統或設備驅動可以直接編譯到內核, 也可以編譯成模塊, 編譯到內核, 使用前一節介紹的方法通過內核啓動參數來向它們傳遞參數, 如果編譯成模塊, 則可以通過命令行在插入模塊時傳遞參數, 或者在運行時, 通過 sysfs
來設置或讀取模塊數據.
Sysfs
是一個基於內存的文件系統, 實際上它基於ramfs
, sysfs
提供了一種把內核數據結構, 它們的屬性以及屬性與數據結構的聯繫開放給用戶態的方式, 它與 kobject
子系統緊密地結合在一起, 因此內核開發者不需要直接使用它, 而是內核的各個子系統使用它. 用戶要想使用 sysfs
讀取和設置內核參數, 僅需裝載 sysfs
就可以通過文件操作應用來讀取和設置內核通過 sysfs
開放給用戶的各個參數:
mkdir -p /sysfs
mount -t sysfs sysfs /sysfs
注意, 不要把 sysfs
和 sysctl
混淆, sysctl
是內核的一些控制參數, 其目的是方便用戶對內核的行爲進行控制, 而 sysfs
僅僅是把內核的 kobject
對象的層次關係與屬性開放給用戶查看, 因此 sysfs
的絕大部分是隻讀的, 模塊作爲一個 kobject
也被出口到 sysfs
, 模塊參數則是作爲模塊屬性出口的, 內核實現者爲模塊的使用提供了更靈活的方式, 允許用戶設置模塊參數在 sysfs
的可見性並允許用戶在編寫模塊時設置這些參數在 sysfs
下的訪問權限, 然後用戶就可以通過 sysfs
來查看和設置模塊參數, 從而使得用戶能在模塊運行時控制模塊行爲.
相關資料鏈接:
用戶空間與內核空間數據交換的方式 (6)——模塊參數與 sysfs:http://www.cnblogs.com/hoys/archive/2011/04/10/2011470.html
2.3 debugfs 文件系統
內核開發者經常需要向用戶空間應用輸出一些調試信息, 在穩定的系統中可能根本不需要這些調試信息, 但是在開發過程中, 爲了搞清楚內核的行爲, 調試信息非常必要, printk 可能是用的最多的, 但它並不是最好的, 調試信息只是在開發中用於調試, 而 printk
將一直輸出, 因此開發完畢後需要清除不必要的 printk
語句, 另外如果開發者希望用戶空間應用能夠改變內核行爲時, printk
就無法實現.
因此, 需要一種新的機制, 那只有在需要的時候使用, 它在需要時通過在一個虛擬文件系統中創建一個或多個文件來向用戶空間應用提供調試信息.
有幾種方式可以實現上述要求:
-
使用
procfs
, 在/proc
創建文件輸出調試信息, 但是procfs
對於大於一個內存頁 (對於x86
是4K
) 的輸出比較麻煩, 而且速度慢, 有時回出現一些意想不到的問題. -
使用
sysfs
(2.6
內核引入的新的虛擬文件系統), 在很多情況下, 調試信息可以存放在那裏, 但是 sysfs 主要用於系統管理,它希望每一個文件對應內核的一個變量,如果使用它輸出複雜的數據結構或調試信息是非常困難的. -
使用
libfs
創建一個新的文件系統, 該方法極其靈活, 開發者可以爲新文件系統設置一些規則, 使用libfs
使得創建新文件系統更加簡單, 但是仍然超出了一個開發者的想象.
爲了使得開發者更加容易使用這樣的機制, Greg Kroah-Hartman
開發了 debugfs
(在 2.6.11
中第一次引入), 它是一個虛擬文件系統, 專門用於輸出調試信息, 該文件系統非常小, 很容易使用, 可以在配置內核時選擇是否構件到內核中, 在不選擇它的情況下, 使用它提供的 API 的內核部分不需要做任何改動.
相關資料鏈接:
用戶空間與內核空間數據交換的方式 (1)——debugfs:http://www.cnblogs.com/hoys/archive/2011/04/10/2011124.html
Linux 內核裏的 DebugFS:http://www.cnblogs.com/wwang/archive/2011/01/17/1937609.html
Linux 驅動調試的 Debugfs 的使用簡介:http://soft.chinabyte.com/os/110/12377610.shtml
Linux Debugfs 文件系統介紹及使用:http://blog.sina.com.cn/s/blog_40d2f1c80100p7u2.html
Linux 內核裏的 DebugFS:http://www.cnblogs.com/wwang/archive/2011/01/17/1937609.html
Debugging the Linux Kernel with debugfs:http://opensourceforu.com/2010/10/debugging-linux-kernel-with-debugfs/
debugfs-seq_file:http://lxr.free-electrons.com/source/drivers/base/power/wakeup.c
Linux Debugfs 文件系統介紹及使用:http://blog.sina.com.cn/s/blog_40d2f1c80100p7u2.html
Linux 文件系統:procfs, sysfs, debugfs 用法簡介:http://www.tinylab.org/show-the-usage-of-procfs-sysfs-debugfs/
用戶空間與內核空間數據交換的方式 (1)——debugfs:http://www.cnblogs.com/hoys/archive/2011/04/10/2011124.html
Linux 運用 debugfs 調試方法:http://www.xuebuyuan.com/1023006.html
2.4 relayfs 文件系統
relayfs
是一個快速的轉發 (relay
) 數據的文件系統, 它以其功能而得名. 它爲那些需要從內核空間轉發大量數據到用戶空間的工具和應用提供了快速有效的轉發機制.
Channel
是 relayfs
文件系統定義的一個主要概念, 每一個 channel
由一組內核緩存組成, 每一個 CPU
有一個對應於該 channel
的內核緩存, 每一個內核緩存用一個在 relayfs
文件系統中的文件文件表示, 內核使用 relayfs
提供的寫函數把需要轉發給用戶空間的數據快速地寫入當前 CPU
上的 channel
內核緩存, 用戶空間應用通過標準的文件 I/
O 函數在對應的 channel
文件中可以快速地取得這些被轉發出的數據 mmap
來. 寫入到 channel
中的數據的格式完全取決於內核中創建channel
的模塊或子系統.
relayfs
的用戶空間API
:
注意 : 用戶態應用在使用上述 API 時必須保證已經掛載了 relayfs 文件系統, 但內核在創建和使用 channel 時不需要 relayfs 已經掛載. 下面命令將把 relayfs 文件系統掛載到 /mnt/relay.
Relay:一種內核到用戶空間的高效數據傳輸技術:https://www.ibm.com/developerworks/cn/linux/l-cn-relay/
2.5 seq_file
一般地, 內核通過在 procfs
文件系統下建立文件來向用戶空間提供輸出信息, 用戶空間可以通過任何文本閱讀應用查看該文件信息, 但是 procfs
有一個缺陷, 如果輸出內容大於 1 個內存頁, 需要多次讀, 因此處理起來很難, 另外, 如果輸出太大, 速度比較慢, 有時會出現一些意想不到的情況, Alexander Viro
實現了一套新的功能, 使得內核輸出大文件信息更容易, 該功能出現在 2.4.15
(包括 2.4.15
) 以後的所有 2.4
內核以及 2.6
內核中, 尤其是在 2.6
內核中,已經大量地使用了該功能
相關資料鏈接:
用戶空間與內核空間數據交換的方式 (3)——seq_file:http://www.cnblogs.com/hoys/archive/2011/04/10/2011261.html
內核 proc 文件系統與 seq 接口(4)—seq_file 接口編程淺析:http://blog.chinaunix.net/uid-20543672-id-3235254.html
Linux 內核中的 seq 操作:http://www.cnblogs.com/qq78292959/archive/2012/06/13/2547335.html
seq_file 源碼分析:http://www.cppblog.com/csjiaxin/articles/136681.html
用序列文件 (seq_file) 接口導出常用數據結構:http://blog.chinaunix.net/uid-317451-id-92670.html
seq_file 機制:http://blog.csdn.net/a8039974/article/details/24052619
3 printk
在內核調試技術之中, 最簡單的就是 printk
的使用了, 它的用法和 C 語言應用程序中的 printf
使用類似, 在應用程序中依靠的是 stdio.h
中的庫, 而在 linux
內核中沒有這個庫, 所以在 linux
內核中, 實現了自己的一套庫函數, printk
就是標準的輸出函數
相關資料鏈接:
linux 內核調試技術之 printk:http://www.cnblogs.com/veryStrong/p/6218383.html
調整內核 printk 的打印級別:http://blog.csdn.net/tonywgx/article/details/17504001
linux 設備驅動學習筆記–內核調試方法之 printk:http://blog.csdn.net/itsenlin/article/details/43205983
4 ftrace && trace-cmd
4.1 trace && ftrace
Linux
當前版本中, 功能最強大的調試、跟蹤手段. 其最基本的功能是提供了動態和靜態探測點, 用於探測內核中指定位置上的相關信息.
靜態探測點, 是在內核代碼中調用 ftrace
提供的相應接口實現, 稱之爲靜態是因爲, 是在內核代碼中寫死的, 靜態編譯到內核代碼中的, 在內核編譯後, 就不能再動態修改. 在開啓 ftrace
相關的內核配置選項後, 內核中已經在一些關鍵的地方設置了靜態探測點, 需要使用時, 即可查看到相應的信息.
動態探測點, 基本原理爲 : 利用 mcount
機制, 在內核編譯時, 在每個函數入口保留數個字節, 然後在使用 ftrace
時, 將保留的字節替換爲需要的指令, 比如跳轉到需要的執行探測操作的代碼。
ftrace
的作用是幫助開發人員瞭解 Linux
內核的運行時行爲, 以便進行故障調試或性能分析.
最早 ftrace
是一個 function tracer
, 僅能夠記錄內核的函數調用流程. 如今 ftrace
已經成爲一個
framework
, 採用 plugin
的方式支持開發人員添加更多種類的 trace
功能.
Ftrace
由 RedHat
的 Steve Rostedt
負責維護. 到 2.6.30
爲止, 已經支持的 tracer
包括 :
這裏還沒有列出所有的 tracer
, ftrace
是目前非常活躍的開發領域, 新的 tracer
將不斷被加入內核。
相關資料鏈接:
ftrace 和它的前端工具 trace-cmd(深入瞭解 Linux 系統的利器):http://blog.yufeng.info/archives/1012
ftrace 簡介:https://www.ibm.com/developerworks/cn/linux/l-cn-ftrace/
內核性能調試–ftrace:http://blog.chinaunix.net/uid-20589411-id-3501525.html
使用 ftrace 調試 Linux 內核,第 1 部分:https://www.ibm.com/developerworks/cn/linux/l-cn-ftrace1
ftrace 的使用:http://blog.csdn.net/cybertan/article/details/8258394
[轉]Linux 內核跟蹤之 trace 框架分析:http://blog.chinaunix.net/uid-24063584-id-2642103.html
Linux trace 使用入門:http://blog.csdn.net/jscese/article/details/46415531
4.2 ftrace 前端工具 trace-cmd
- trace-cmd 介紹
trace-cmd
和 開源的 kernelshark
均是內核Ftrace
的前段工具, 用於分分析核性能.
他們相當於是一個 /sys/kernel/debug/tracing
中文件系統接口的封裝, 爲用戶提供了更加直接和方便的操作.
- 使用
# 收集信息
sudo trace-cmd reord subsystem:tracing
# 解析結果
#sudo trace-cmd report
trace-cmd: A front-end for Ftrace:https://lwn.net/Articles/410200/
其本質就是對/sys/kernel/debug/tracing/events
下各個模塊進行操作, 收集數據並解析
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
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/NpHbasDPC993m1U0iDUvpQ