核心除錯方法

2021-09-01 12:41:38 字數 2564 閱讀 9511

跟普通應用程式一樣,列印資訊是最直接的除錯手段,通過列印資訊來獲得核心執行的情況和狀態。

功能:通過控制台把核心資訊按照日誌級別列印出來。

檢視當前的系統的列印等級: cat /proc/sys/kernel/printk >7 4 1 7這裡四個引數的意義:如下

7:當前控制台命令級別,只要小於這個的命令級別才能夠被列印出來。

4:預設printk列印等級,即printk(「hello world」)函式不帶命令等級的時候預設的等級,這裡的是4比7小,則會列印。

1:控制台級別可被設定的最小值(最高優先順序)這裡的1表示我控制台級別最高可以設定到1,那麼級別為0的就一直會被列印

7:預設的控制台日誌級別,當沒有設定控制台級別是就是預設的7級別

修改列印級別:# echo 3 > /proc/sys/kernel/printk或者echo 「3 4 1 7」 > /proc/sys/kernel/printk

printk低階別的列印資訊並沒有被核心所丟棄,而是跟其他的資訊一起存放在buffer裡,通過dmesg可以把這些訊息列印出來

基本用法:(1)直接輸入dmesg,列印logbuffer中快取所有資訊,利用管道組合grep可以查詢帶***資訊列印,dmesg | grep *** ;(2)dmesg -c 顯示的同時清空buffer資料,重新開始記錄 (3)dmesg -n 列印級別,設定記錄控制台輸出最低級別;

有些會直接解析列印出來,有些只有pc值和棧資訊,那麼就要根據這些原始的值得出問題

確定該指令是核心還是載入的模組:通過核心編譯目錄下的system.map確定核心的函式位址範圍,如果不屬於這裡則屬於載入的程式

①,在map內屬於核心的函式

②,不在map內屬於模組程式:cat /proc/kallsysms命令把所有的函式(核心函式、載入的函式)的位址都列印出來,在這裡找乙個相近的位址,保證是在這個函式內。

反彙編對應的程式: 核心或者是驅動模組:arm-xilinx-linux-dump得到相應反彙編檔案:

①,找到對應的函式

②,找到對應的語句,通過彙編得到對應的c語言位置

③,分析出錯的原因

stack: (0xc3c7be88 to 0xc3c7c000) be80: c3c7bebc

c3c7be98 c008d888 bf000010 00000000 c049abc0 bea0: c3e740c0 c008d73c

c0474e20 c3e766a8 c3c7bee4 c3c7bec0 c0089e48 c008d74c bec0: c049abc0

c3c7bf04 00000003 ffffff9c c002c044 c3d10000 c3c7befc c3c7bee8 bee0:

c0089f64 c0089d58 00000000 00000002 c3c7bf68 c3c7bf00 c0089fb8

c0089f40 bf00: c3c7bf04 c3e766a8 c0474e20 00000000 00000000 c3eb1000

00000101 00000001 bf20: 00000000 c3c7a000 c04a7468 c04a7460 ffffffe8

c3d10000 c3c7bf68 c3c7bf48 bf40: c008a16c c009fc70 00000003 00000000

c049abc0 00000002 bec1fee0 c3c7bf94 bf60: c3c7bf6c c008a2f4 c0089f88

00008520 bec1fed4 0000860c 00008670 00000005 bf80: c002c044 4013365c

c3c7bfa4 c3c7bf98 c008a3a8 c008a2b0 00000000 c3c7bfa8 bfa0: c002bea0

c008a394 bec1fed4 0000860c 00008720 00000002 bec1fee0 00000001 bfc0:

bec1fed4 0000860c 00008670 00000002 00008520 00000000 4013365c

bec1fea8 bfe0: 00000000 bec1fe84 0000266c 400c98e0 60000010 00008720

00000000 00000000

利用列印出來的棧資訊通過指令解析得到函式呼叫過程,以及在最後在**掛掉的。

通過系統定時器中斷:當系統卡死的時候定時器中斷還是會一直產生中斷。當進入中斷的時候一直是同乙個pid:current->pid可以獲取當前的pid得到卡死的程序;

進入中斷的時候都會儲存現場:即會把當前的arm暫存器儲存起來,其中就有pc指標,得到pc指標可以推算出卡死的位置:在中斷總入口處新增**

if當前中斷等於系統定時器中斷

cat /proc/kallsysms得到所有函式的位址,通過pc值分析卡死的位置

核心模組的除錯方法

核心可載入模組的除錯具有其特殊性。由於核心模組中各段的位址是在模組載入進核心的時候才最終確定的,所以 develop 機的gdb 無法得到各種符號位址資訊。所以,使用 kgdb 除錯模組所需要解決的乙個問題是,需要通過某種方法獲得可載入模組的最終載入位址資訊,並把這些資訊加入到 gdb環境中。i 在...

Windbg除錯核心驅動方法

一般說來,調速驅動程式分為兩種 1.存在pdb檔案的除錯 這裡的pdb檔案其實就是除錯符號檔案,假如我們除錯的這樣的檔案,我們可以再windbg中使用 bp 驅動名 driverentry,這個時候當載入驅動的時候,程式就會斷在入口了。2.沒有pdb檔案的除錯 在除錯別人的驅動程式時,也就是自己只有...

Windbg除錯核心驅動方法1

一般說來,調速驅動程式分為兩種 1.存在pdb檔案的除錯 這裡的pdb檔案其實就是除錯符號檔案,假如我們除錯的這樣的檔案,我們可以再windbg中使用 bp 驅動名 driverentry,這個時候當載入驅動的時候,程式就會斷在入口了。2.沒有pdb檔案的除錯 在除錯別人的驅動程式時,也就是自己只有...