Linux 核心測試與除錯(3)

2021-09-23 16:50:01 字數 3305 閱讀 9796

安裝好核心後,試試能不能啟動它。能啟動的話,檢查 dmesg 看看有沒有隱藏的錯誤。試試下面的功能:

使用 dmesg 檢視隱藏的問題,對於定位新**帶來的 bug 是乙個好方法。一般來說,dmesg 不會輸出新的 crit, alert, emerg 級別的錯誤資訊,也不應該出現新的 err 級別的資訊。你要注意的是那些 warn 級別的日誌資訊。請注意 warn 這個級別的資訊並不是壞訊息,新**帶來新的警告資訊,不會給核心帶去嚴重的影響。

下面的指令碼執行了上面的命令,並且將輸出儲存起來,以便與老的核心的 dmesg 輸出作比較(lctt:老核心的 dmesg 輸出在本系列的第二篇文章中有介紹)。然後執行 diff 命令,檢視新老核心 dmesg 日誌之間的不同。這個指令碼需要輸入老核心版本號,如果不輸入引數,它只會生成新核心的 dmesg 日誌檔案後直接退出,不再作比較(lctt:話是這麼說沒錯,但點開指令碼一看,沒輸引數的話,這貨會直接退出,連新核心的 dmesg 日誌也不會儲存的)。如果 dmesg 日誌有新的警告資訊,表示新發布的核心有漏網之「蟲」,這些 bug 逃過了自測和系統測試。你要看看,那些警告資訊後面有沒有棧跟蹤資訊?也許這裡有很多問題需要你進一步調查分析。

time

make

all我們可以在 linux 核心本身找到多種測試方法。下面介紹乙個很好用的功能測試工具集: ktest 套件

ktest 是乙個自動測試套件,它可以提供編譯安裝啟動核心一條龍測試服務,也可以跑交叉編譯測試,前提是你的系統有安裝交叉編譯所需要的軟體。ktest 依賴於 flex 和 bison。詳細資訊請參考放在 tools/testing/ktest 目錄下的文件,你可以自學成材。另外還有一些參考資料教你怎麼使用 ktest:

我們來玩玩自測吧。核心原始碼的多個子系統都有自己的自測工具,到目前為止,斷點、cpu熱插拔、efivarfs、ipc、kcmp、記憶體熱插拔、mqueue、網路、powerpc、ptrace、rcutorture、定時器和虛擬機器子系統都有自測工具。另外,使用者態記憶體的自測工具可以利用 testusercopy 模組來測試使用者態記憶體到核心態的拷貝過程。下面的命令演示了如何使用這些測試工具:

編譯測試:

make

-c tools

/testing

/selftests

測試全部:(有些測試需要 root 許可權,你需要以 root 使用者登入系統然後執行命令)

make

-c tools

/testing

/selftests run_tests

只測試單個子系統:

make

-c tools

/testing

/selftests targets

=vm run_tests

在 tools/testing 目錄下的另乙個測試套件是 fault-injection。failcmd.sh 指令碼用於檢測 slab 和記憶體頁分配器的錯誤。這些工具可以測試核心能否很好地從錯誤狀態中恢復回來。這些測試需要用到 root 許可權。下面簡單介紹了一些當前能提供的錯誤檢測方法。隨著錯誤檢測方法的增加,這份名單也會不斷增長。最新的名單請參考 documentation/fault-injection/fault-injection.txt 文件。

failslab (預設選項)

產生 slab 分配錯誤。作用於 kmalloc(), kmemcachealloc() 等函式(lctt:產生的結果是呼叫這些函式就會返回失敗,可以模擬程式分不到記憶體時是否還能穩定執行下去)。

fail_page_alloc

產生記憶體頁分配的錯誤。作用於 allocpages(), getfree_pages() 等函式(lctt:同上,呼叫這些函式,返回錯誤)。

fail_make_request

對滿足條件(可以設定 /sys/block//make-it-fail 或 /sys/block///make-it-fail 檔案)的磁碟產生 io 錯誤,作用於 generic_make_request() 函式(lctt:所有針對這塊磁碟的讀或寫請求都會出錯)。

fail_mmc_request

對滿足條件(可以設定 /sys/kernel/debug/mmc0/fail_mmc_request 這個 debugfs 屬性)的磁碟產生 mmc 資料錯誤。

你可以自己配置 fault-injection 套件的功能。fault-inject-debugfs 核心模組在系統執行時會在 debugfs 檔案系統下面提供一些屬性檔案。你可以指定出錯的概率,指定兩個錯誤之間的時間間隔,當然本套件還能提供更多其他功能,具體請檢視 documentation/fault-injection/fault-injection.txt。 boot 選項可以讓你的系統在 debugfs 檔案系統起來之前就可以產生錯誤,下面列出幾個 boot 選項:

fault-injection 套件提供介面,以便增加新的功能。下面簡單介紹下增加新功能的步驟,詳細資訊請參考上面提到過的文件:

使用 declare_fault_injection(name) 定義預設屬性;

詳細資訊可檢視 fault-inject.h 中定義的 struct fault_attr 結構體。

配置 fault 屬性,新建乙個 boot 選項;

這步可以使用 setup_fault_attr(attr, str) 函式完成,為了能在系統啟動的早期產生錯誤,新增乙個 boot 選項這一步是必須要有的。

新增 debugfs 屬性;

使用 fault_create_debugfs_attr(name, parent, attr) 函式,為新功能新增新的 debugfs 屬性。

為模組設定引數;

為模組新增一些引數,對於配置錯誤屬性來說是乙個好主意,特別是當新功能的應用範圍受限於單個核心模組的時候(lctt:不同核心,你的新功能可能需要不同的測試引數,通過設定引數,你的功能可以不必為了迎合不同核心而每次都重新編譯一遍)。

新增乙個鉤子函式到錯誤測試的**中。

should_fail(attr, size) —— 當這個鉤子函式返回 true 時,使用者的**就應該產生乙個錯誤。

應用程式使用這個 fault-injection 套件可以指定某個具體的核心模組產生 slab 和記憶體頁分配的錯誤,這樣就可以縮小效能測試的範圍。

Linux 核心測試和除錯(5)

linux 電源管理子系統在 環境下提供5種測試方式。這些方式僅僅在核心各層之間執行休眠的 而不是真正的讓系統進入休眠狀態。有些平台不能掛起系統,比如說我們需要模擬飛機的飛行環境,這時候使用這種 環境就非常有用處了。freezer 測試停掉處理器 echo freezer sys power pm ...

linux 核心除錯

debug.hacks 一書中,介紹了如果除錯核心問題,在第五章的 實踐核心除錯 總體來說,有一下的方法來除錯核心 1.用kgdb單步除錯。具體請參見 2.加列印printk來定位。3.根據核心出錯的kernel panic oops資訊,反彙編,定位問題 4.編寫復現程式,或者創造復現條件。5.g...

LINUX核心設計與實現之除錯

核心排程主要靠經驗和對整個作業系統的把握.18.1 排程前需要準備什麼 重現bug.18.2 核心中的 bug 引發核心中的bug 的原因如下 同步 定時限制 競爭條件.18.3 printk 在終端沒有初始化之前,printk 函式是不可用的 比如在 setup arch 函式之前 不過可以用 p...