Linux 內核測試與調試(3)

基本測試

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

  • 網絡(Wifi 或者網線)是否可用?html

  • ssh 是否可用?linux

  • 使用 ssh 遠程傳輸文件。git

  • 使用 git clone 和 git pull 命令。github

  • 用用網絡瀏覽器。瀏覽器

  • 查看 email。網絡

  • 使用 ftp, wget 等軟件下載文件。ssh

  • 播放音頻視頻文件。函數

  • 連上 USB 鼠標等設備。工具

檢查內核日誌

使用 dmesg 查看隱藏的問題,對於定位新代碼帶來的 bug 是一個好方法。通常來講,dmesg 不會輸出新的 crit, alert, emerg 級別的錯誤信息,也不該該出現新的 err 級別的信息。你要注意的是那些 warn 級別的日誌信息。請注意 warn 這個級別的信息並非壞消息,新代碼帶來新的警告信息,不會給內核帶去嚴重的影響。

  • dmesg -t -l emerg

  • dmesg -t -l crit

  • dmesg -t -l alert

  • dmesg -t -l err

  • dmesg -t -l warn

  • dmesg -t -k

  • dmesg -t

下面的腳本運行了上面的命令,而且將輸出保存起來,以便與老的內核的 dmesg 輸出做比較(LCTT:老內核的 dmesg 輸出在本系列的第二篇文章中 有介紹)。而後運行 diff 命令,查看新老內核 dmesg 日誌之間的不一樣。這個腳本須要輸入老內核版本號,若是不輸入參數,它只會生成新內核的 dmesg 日誌文件後直接退出,再也不做比較(LCTT:話是這麼說沒錯,但點開腳本一看,沒輸參數的話,這貨會直接退出,連新內核的 dmesg 日誌也不會保存的)。若是 dmesg 日誌有新的警告信息,表示新發布的內核有漏網之「蟲」,這些 bug 逃過了自測和系統測試。你要看看,那些警告信息後面有沒有棧跟蹤信息?也許這裏有不少問題須要你進一步調查分析。

壓力測試

執行壓力測試的一個好辦法是同時跑三四個內核編譯任務。下載各類版本的內核,同時編譯它們,並記錄時間。比較新內核跑壓力測試和老內核跑壓力測試所 花的時間,而後能夠定位新內核的性能。若是新內核跑壓力測試的時間比老內核的更長,說明新內核的部分模塊性能退步了。性能問題很難調試出來。第一步是找出 哪裏致使的性能退步。同時跑多個內核編譯任務對檢測內核總體性能來講是個好方法,可是這種方法涵蓋了多個內核模塊,好比內存管理、文件系統、DMA、驅動 等(LCTT:也就是說,這種壓力測試沒辦法定位到是哪一個模塊形成了性能的降低)。

time make all

內核測試工具

咱們能夠在 Linux 內核自己找到多種測試方法。下面介紹一個很好用的功能測試工具集: ktest 套件

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

tools/testing/selftests 套件

咱們來玩玩自測吧。內核源碼的多個子系統都有本身的自測工具,到目前爲止,斷點、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 套件

在 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 選項:

  • failslab=

  • fail_page_alloc=

  • fail_make_request=

  • mmc_core.fail_request=[interval],[probability],[space],[times]

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 和內存頁分配的錯誤,這樣就能夠縮小性能測試的範圍。


via: http://www.linuxjournal.com/content/linux-kernel-testing-and-debugging?page=0,2

譯者:bazz2 校對:wxy

本文由 LCTT 原創翻譯,Linux中國 榮譽推出

 

來源: linuxjournal

    原文: http://www.linuxjournal.com/content/linux-kernel-testing-and-debugging?page=0,2         做者: Shuah Khan

        譯者: bazz2

               

本文是原創投遞或翻譯投遞,Linux中國首發地址:http://linux.cn/article-3630-1.html

歡迎轉載,敬請在正文中標註並保留原文/譯文連接和做者/譯者等信息

相關文章
相關標籤/搜索