核心可載入模組的除錯具有其特殊性。由於核心模組中各段的位址是在模組載入進核心的時候才最終確定的,所以
develop
機的gdb
無法得到各種符號位址資訊。所以,使用
kgdb
除錯模組所需要解決的乙個問題是,需要通過某種方法獲得可載入模組的最終載入位址資訊,並把這些資訊加入到
gdb環境中。 i
、在linux 2.4
核心中的核心模組除錯方法 在
linux2.4.x
核心中,可以使用
insmod -m
命令輸出模組的載入資訊,例如:
[root@lisl tmp]# insmod -m hello.ko >modaddr
檢視模組載入資訊檔案
modaddr
如下:
.this 00000060 c88d8000 2**2
.text 00000035 c88d8060 2**2
.rodata 00000069 c88d80a0 2**5
…….data 00000000 c88d833c 2**2
.bss 00000000 c88d833c 2**2……
在這些資訊中,我們關心的只有
4個段的位址
:.text
、.rodata
、.data
、.bss
。在development
機上將以上位址資訊加入到
gdb中
,這樣就可以進行模組功能的測試了。
(gdb) add-symbol-file hello.o 0xc88d8060 -s .data 0xc88d80a0 -s
.rodata 0xc88d80a0 -s .bss 0x c88d833c
這種方法也存在一定的不足,它不能除錯模組初始化的**,因為此時模組初始化**已經執行過了。而如果不執行模組的載入又無法獲得模組插入位址,更不可能在模組初始化之前設定斷點了。對於這種除錯要求可以採用以下替代方法。 在
target
機上用上述方法得到模組載入的位址資訊,然後再用
rmmod
解除安裝模組。在
development
機上將得到的模組位址資訊匯入到
gdb環境中,在核心**的呼叫初始化**之前設定斷點。這樣,在
target
機上再次插入模組時,**將在執行模組初始化之前停下來,這樣就可以使用
gdb命令除錯模組初始化**了。
另外一種除錯模組初始化函式的方法是:當插入核心模組時,核心模組機制將呼叫函式
sys_init_module(kernel/modle.c)
執行對核心模組的初始化,該函式將呼叫所插入模組的初始化函式。程式**片斷如下:
…… ……
if (mod->init != null)
ret = mod->init();
…… ……
在該語句上設定斷點,也能在執行模組初始化之前停下來。 ii
、在linux 2.6.x
核心中的核心模組除錯方法
linux 2.6
之後的核心中,由於
module-init-tools
工具的更改,
insmod
命令不再支援
-m 引數,只有採取其他的方法來獲取模組載入到核心的位址。通過分析
elf檔案格式,我們知道程式中各段的意義如下:
.text
(**段):用來存放可執行檔案的操作指令,也就是說是它是可執行程式在記憶體種的映象。
.data
(資料段):資料段用來存放可執行檔案中已初始化全域性變數,也就是存放程式靜態分配的變數和全域性變數。
.bss
(bss
段):bss
段包含了程式中未初始化全域性變數,在記憶體中
bss段全部置零。
.rodata
(唯讀段):該段儲存著唯讀資料,在程序映象中構造不可寫的段。
通過在模組初始化函式中放置一下**,我們可以很容易地獲得模組載入到記憶體中的位址。 ……
int bss_var;
static int hello_init(void)
module_init(hello_init);
這裡,通過在模組的初始化函式中新增一段簡單的程式,使模組在載入時列印出在核心中的載入位址。
.rodata
段的位址可以通過執行命令
readelf -e hello.ko
,取得.rodata
在檔案中的偏移量並加上段的
align
值得出。
為了使讀者能夠更好地進行模組的除錯,
kgdb
專案還發布了一些指令碼程式能夠自動探測模組的插入並自動更新
gdb 中模組的符號資訊。這些指令碼程式的工作原理與前面解釋的工作過程相似,更多的資訊請閱讀參考資料
[4]。
核心模組宕機除錯
介紹一種核心模組宕機除錯的方法。在程式中,通常必現的宕機很好解決,但是如果是拷機宕機的話,則如果有好的方法和工具借助往往會極大的提高解決問題的速度。在linux中,應用空間程式宕機通常可以借助gdb addr2line等工具進行快速定位。但是,在核心空間中,大部分嵌入式晶元都不支援核心空間的kgdb...
crash除錯核心模組
wifi 模組出現panic時,怎麼根據fulldump去分析wifi問題,以及怎麼除錯wlan的ko檔案?這裡介紹linux下的crash工具來分析fulldump,當然也可以用trace32,gdb等其他工具.1.安裝crash工具 編譯和安裝 make target arm64 make in...
核心除錯方法
跟普通應用程式一樣,列印資訊是最直接的除錯手段,通過列印資訊來獲得核心執行的情況和狀態。功能 通過控制台把核心資訊按照日誌級別列印出來。檢視當前的系統的列印等級 cat proc sys kernel printk 7 4 1 7這裡四個引數的意義 如下 7 當前控制台命令級別,只要小於這個的命令級...