2010-04-09 61 views
3

我正在使用遠程(k)gdb調試模塊中的問題,導致加載時出現恐慌,例如,當調用init()時。如何調試Linux內核模塊`init()`中的問題?

堆棧跟蹤只顯示do_one_initcall(mod->init)導致崩潰。爲了獲得加載到gdb中的符號文件,我需要獲取模塊文本部分的地址,並獲得我需要加載的模塊。

因爲BusyBox中的insmod(1.16.1)不支持-m所以我堅持到grep modulename /proc/modules +添加來自nm偏移找出地址。

所以我在這裏面對一種雞和一個雞蛋的問題 - 爲了能夠調試模塊加載,我需要加載模塊 - 但爲了獲得模塊加載,我需要調試問題...

所以我目前考慮兩個選擇 - 是否有一種方式來獲得地址信息之一:

  1. 通過的printk()在模塊初始化代碼
  2. 通過的printk ()內核代碼

所有調用此之前mod->init() - 這樣我就可以把一個斷點,裝載符號文件,打Ç,看看它和好如初......

回答

5

你可以建立你的代碼到內核中而比作爲一個模塊?這可能會簡化調試init()調用。

您也可以在do_one_initcall()處設置斷點並查看地址mod->init以獲取加載地址。

+0

將代碼編譯到內核中會太繁瑣(每次都需要閃爍電路板而不是wget到ramdisk)。打破'do_one_initcall()'足以幫助查明問題,以便我可以推遲崩潰,直到開始與模塊通信的用戶模式進程。謝謝。 – Kimvais 2010-04-12 13:05:20