Linux 內核的經典調試方式

1 內核調試以及工具總結


內核總是那麼捉摸不透, 內核也會犯錯, 但是調試卻不能像用戶空間程序那樣, 爲此內核開發者爲我們提供了一系列的工具和系統來支持內核的調試.

內核的調試, 其本質是內核空間與用戶空間的數據交換, 內核開發者們提供了多樣的形式來完成這一功能.

2 用戶空間與內核空間數據交換的文件系統


內核中有三個常用的僞文件系統: procfs, debugfs 和 sysfs.

它們都用於 Linux 內核和用戶空間的數據交換, 但是適用的場景有所差異:

相關資料鏈接:

在 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 是比較老的一種用戶態與內核態的數據交換方式, 內核的很多數據都是通過這種方式出口給用戶的, 內核的很多參數也是通過這種方式來讓用戶方便設置的. 除了 sysctl 出口到 /proc 下的參數, procfs 提供的大部分內核參數是隻讀的. 實際上, 很多應用嚴重地依賴於 procfs, 因此它幾乎是必不可少的組件. 前面部分的幾個例子實際上已經使用它來出口內核數據, 但是並沒有講解如何使用, 本節將講解如何使用procfs.

2.2 sysfs 文件系統


內核子系統或設備驅動可以直接編譯到內核, 也可以編譯成模塊, 編譯到內核, 使用前一節介紹的方法通過內核啓動參數來向它們傳遞參數, 如果編譯成模塊, 則可以通過命令行在插入模塊時傳遞參數, 或者在運行時, 通過 sysfs 來設置或讀取模塊數據.

Sysfs 是一個基於內存的文件系統, 實際上它基於ramfssysfs 提供了一種把內核數據結構, 它們的屬性以及屬性與數據結構的聯繫開放給用戶態的方式, 它與 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 就無法實現.

因此, 需要一種新的機制, 那只有在需要的時候使用, 它在需要時通過在一個虛擬文件系統中創建一個或多個文件來向用戶空間應用提供調試信息.

有幾種方式可以實現上述要求:

爲了使得開發者更加容易使用這樣的機制, 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 包括 :

這裏還沒有列出所有的 tracerftrace 是目前非常活躍的開發領域, 新的 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 和 開源的 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 實現了三種類型的探測點 : kprobesjprobes和 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 HatIntelHitachi 和 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

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不在支持彙編級的源碼調試. 因此它現在也是平臺獨立的.

  1. kdump 和 kexec 已經被移除。

  2. 從 / proc/meninfo 中獲取的信息比以前少了。

  3. bt 命令現在使用的是內核的 backtracer,而不是 kdb 原來使用的反彙編。

  4. 合併之後的 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 是用來進行軟件性能分析的工具。
通過它, 應用程序可以利用 PMUtracepoint 和內核中的特殊計數器來進行性能統計. 它不但可以分析指定應用程序的性能問題 (per thread). 也可以用來分析內核的性能問題, 當然也可以同時分析應用代碼和內核,從而全面理解應用程序中的性能瓶頸.

最初的時候, 它叫做 Performance counter, 在 2.6.31 中第一次亮相. 此後他成爲內核開發最爲活躍的一個領域. 在 2.6.32 中它正式改名爲 Performance Event, 因爲 perf 已不再僅僅作爲 PMU 的抽象, 而是能夠處理所有的性能相關的事件.

使用 perf, 您可以分析程序運行期間發生的硬件事件,比如 instructions retired , processor clock cycles 等; 您也可以分析軟件事件, 比如 Page Fault 和進程切換。

這使得 Perf 擁有了衆多的性能分析能力, 舉例來說,使用 Perf 可以計算每個時鐘週期內的指令數, 稱爲 IPCIPC 偏低表明代碼沒有很好地利用 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