安裝自己的核心,發行版核心會關閉映像效能的除錯功能,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...