crash除錯核心模組

2021-08-21 09:49:29 字數 1950 閱讀 8412

wifi 模組出現panic時,怎麼根據fulldump去分析wifi問題,以及怎麼除錯wlan的ko檔案?

這裡介紹linux下的crash工具來分析fulldump,當然也可以用trace32,gdb等其他工具.

1. 安裝crash工具

編譯和安裝:make target=arm64;make install

2. crash工具載入fulldump檔案

載入指令: crash /path_name/vmlinux --kaslr=0x4de600000 --machdep kimage_voffset=0xffffff8466600000 ddrcs0_0.bin@0x80000000,ddrcs0_1.bin@0x100000000,ddrcs1_0.bin@0x140000000,ddrcs1_1.bin@0x1c0000000

注意事項:2.1 需要指定kaslr和 kimage_voffset的值,crash才能正常載入dump.

2.2 每個ddr檔案後面需要跟起始實體地址

3. crash工具分析wlan ko檔案

由於wlan驅動是以ko形式新增到系統中,所以還需要在crash命令列手動載入wlan.ko

根據第二步進入crash互動後,輸入wlan.ko檔案的路徑

crash> mod -s wlan  /home/***/disk/main/test/log/0708/wifi/debug/wlan/qca_cld3_wlan.ko.unstripped

顯示載入成功的介面:

4. 案例分析

載入wlan.ko檔案後,可以進行crash除錯

4.1 顯示pc指標對應行號 :sym指令

可以看出,最後panic在1345行,通過**,初步推斷pbssdesc這個結構訪問出現異常

4.2 檢視pbssdesc變數內容

要檢視變數內容,必須先找到pbssdesc的位址.**中有pbssdesc->iefields的定址,

通過crash指令得到iefields在結構體中的偏移量:crash> struct tsirbssdescription -ox,得知iefields的偏移量為0x1b0

反彙編函式csr_get_parsed_bss_description_ies有如下彙編語句:

crash> dis csr_get_parsed_bss_description_ies

add x1,x19 ,#0x1b0 得知,暫存器x19就是pbssdesc的位址. 從kernel oops中得到x19的值為0xffffffc38a3230b0

就可以用crash指令p或者struct列印記憶體:

可以看到pbssdesc記憶體全部為0xaa,0xaa在核心中表示已經呼叫free_page釋放記憶體,從這裡可以得出結論,pbssdesc已經被釋放了

這是典型的use after free問題.通過**就可以知道釋放和分配的地方,從而找到問題原因

5. 常見crash指令

可以直接看說明文件:

檢視所有的tcp/udp連線

foreach net -s
顯示block狀態程序堆疊

foreach un bt

顯示所有程序的bt

foreach bt //顯示所有

foreach ps //顯示所有程序

foreach  pid vm //顯示程序的虛擬記憶體

顯示記憶體資訊

kmem -i

kmem -s /*顯示slab */

rd address /* 讀取記憶體*/

directory /* 指定目錄*/

顯示結構體:

struct struct_name address

timer //顯示系統中的

runq://顯示系統所有runq資訊:

p //用p列印記憶體或者結構體

dis//反彙編

rd//讀記憶體

核心模組宕機除錯

介紹一種核心模組宕機除錯的方法。在程式中,通常必現的宕機很好解決,但是如果是拷機宕機的話,則如果有好的方法和工具借助往往會極大的提高解決問題的速度。在linux中,應用空間程式宕機通常可以借助gdb addr2line等工具進行快速定位。但是,在核心空間中,大部分嵌入式晶元都不支援核心空間的kgdb...

用gdb除錯核心模組

請讀者試用 本人開發搜尋頁面 速谷歌 本文也即 linux device drivers ldd3的第四章debuging techniques的讀書筆記之六,但我們不限於此內容。這章看得比較慢,最近比較懶,而陷入了文件工作中,我決定這章節不會有之七,在之六打住。在使用者程式中,有很多編譯工具同提供...

核心模組的除錯方法

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