linux裝置驅動四(除錯技術)

2021-10-07 20:23:41 字數 2871 閱讀 8175

安裝自己的核心,發行版核心會關閉映像效能的除錯功能,kernel hacking的配置:

printk,根據級別或優先順序鎖表示的嚴重程度對訊息進行分類。使用巨集來標示日誌界別,巨集會展開為乙個字串,編譯時和訊息文字拼接在一起,它們之間不需要逗號分割

通過將printk定義為乙個巨集,使用該巨集來列印訊息,這樣可以開啟和關閉訊息

必須實現四個迭代器物件:

優點

獲取資料比proc快得多,二進位制比文字有效

不需要分割資料為不超過乙個頁的片段

缺點

需要乙個程式來呼叫ioctl

strace,可以顯示程式發出的所有系統呼叫。不僅可以顯示呼叫,而且還能顯示呼叫引數以及用符號形式表示的返回值。

-t 顯示呼叫發生的時間

-t 顯示呼叫話費的時間

-e 限定被跟蹤的呼叫型別

-o 將輸出重定向到乙個檔案

oops訊息

引用乙個非法指標,頁表無法對映到實體地址,處理器向作業系統發出page fault。如果位址非法,核心無法換入page in 缺失頁面,就會產生oops

通過棧清單確定區域性變數和函式引數的值

棧頂部的ffffffff是導致故障的字串,使用者空間的預設棧自0xc00000000鄉下,因此0xbfffda70可能使用空間的棧位址,該位址呼叫連上重複鄉下傳遞。x86架構上,核心空間起始於0xc00000000,大於該位址的幾乎肯定是核心空間位址等等。

通過在一些關鍵點上插入schedule呼叫可以防止死迴圈。當驅動程式因為錯誤陷入死迴圈時,借助schedule呼叫殺死這個程序。或者加入一些列印資訊

顯示器上時鐘或者系統複核表任然在更新說明系統任然在工作

sysrq,通過alt和sysrq組合鍵啟用,通過sysrq和第三個按鍵,核心執行不同動作:

echo 0 > /proc/sys/kernel/sysrq 禁用sysrq功能

可以向/proc/sysrq-trigger寫入字元來觸發相應的sysrq動作,這個入口點始終可用,即使sysrq是禁止的。

構造乙個開啟補習功能的核心,並通過引導命令列引數profile=2引導該核心,利用readprofile工具重置剖析計數器,讓驅動程式進入死迴圈,經過一段時間再次使用readprofile即可觀察浪費cpu資源的核心位置。復現故障時要保護好資料,以唯讀掛載硬碟。

偵錯程式非常耗時,應盡量避免

gdb /usr/src/linux/vmlinux(正站在執行核心的未壓縮映像檔案) /proc/kcore(核心在記憶體中的核心映像)

kcore用來按照core檔案的格式表示核心的「可執行檔案」;由於它要表示對應於所有物理記憶體的整個核心位址空間,所以是乙個非常巨大的檔案。

使用gdb列印的資料,是正在執行核心資料的乙個快取,要保持更新可以執行core-file/proc/kcore命令。不過快取的是引用過的,第一次訪問總是訪問到最新的資料

gdb不能修改核心資料,不能設定斷點或觀察點,也不能但不跟蹤

gdb要起作用,必須開啟config_debug_info

模組不是傳遞給gdb的vmlinux映像的一部分,需要另外處理

模組有很多**段,和除錯相關的只有三個:

.text 模組的可執行**

.bss

.data 這兩個**段儲存模組的變數,編譯時未初始化的在.bss中,其他初始化的在.data中

gdb要能處理模組,必須告訴偵錯程式,模組**段的具體位置,可以通過/sysfs/module獲得,在/sys/module/module_name/sections目錄中

通過add-symbol-file加入模組**段位址資訊

print *(address) 可以傳入十六位位址,輸出對應檔案以及**行數

oss.sgi.com上以非正式補丁形式提供

獲得補丁

patch操作

重編核心

僅可用於ia-32(x86)系統

在控制台按下pause(或break)啟動除錯

當核心發生oops,或到達某個斷點也會啟動除錯

kdb執行時,核心所做的每件事都會停下來,啟用kdb時,不應執行其他東西

如果要使用kdb,最好在啟動時進入單使用者模式

bp,設定斷點(gdb中b)

go,開始執行(gdb中人r)

bt,堆疊跟蹤資訊

mds,用來檢視資料,資料顯示是以16進製制位址顯示的,沒有符號名,所以需要自己轉換

mm,可以修改記憶體資料

gdb和kdb均無法提供類似應用程式開發人員使用的環境

也是通過補丁的方式

kgdb將執行除錯核心的系統和執行偵錯程式的系統隔離開,通過串列埠線連線

以支援通過區域網通訊,開啟乙太網模式,在引導時設定kgdboe引數,指出命令**ip

user-mode linux, uml,可以是linux核心稱為乙個使用者模式的程序。

優點:可以很容易利用gdb進行除錯。

缺點:無法訪問主機硬體。無法除錯正真和硬體打交道的驅動程式。

linux trace toolkit,ltt是乙個核心補丁,可以跟蹤時間資訊,合理建立在一段制定時間內所發生時間的完整描述,可用於測試,或**效能方面的問題。

dynamic probes,dprobes,可以在系統任何地方防止乙個探針,可以是使用者空間也可以是核心空間。探針是一些特殊**,,到達給定點時,開始執行。

核心需要編譯進這個功能

linux裝置驅動程式除錯

一 寫linux裝置驅動程式最難的地方就是沒有強大的除錯工具,一般間接或者直接的除錯手段 1.利用printk 2.檢視oop訊息 3.利用strace 4.利用核心內建的hacking選項 5.利用ioctl方法 6.利用 proc檔案系統 7.使用kgdb 8.使用systemtap 二 1,利...

Linux裝置驅動程式 驅動除錯printk

前一段時間學了一下,printk 列印語句,現在用起來又忘了,看了一下前一段時間做的筆記,不是很詳細,所以決定再寫一下和printk相關的除錯的東西。算是複習一下吧。首先,先熟悉一下printk函式,這個函式和printf函式很類似。只不過乙個執行在使用者態,乙個執行在核心態。此外還是要熟悉一下終端...

裝置驅動 四

實現操作集合 實現open 統計計數,檢查錯誤 申請資源 識別次裝置號,如果必要更新f op指標 實現realse open逆操作 實現實現read copy to user 返回值為未被讀取的位元組數實現write copy from user 返回值為未被讀取的位元組數 實現unlocked i...