[英]How to debug the init_module() call of a Linux kernel module?
我正在進行Linux內核開發的第一步。 我有一些代碼生成一個.ko
內核模塊,我用insmod
安裝。 我想要一種方法來調試安裝模塊時會發生什么,但我遇到了一些困難。
我需要調試對init_module
的調用。 我運行insmode
時調用了這個函數嗎?
我嘗試使用insmod "/my/url/fil.ko" -m
來調試會發生什么,但每次我收到錯誤-1 Unknown symbol in module
而在/cat/log/message
我可以看到錯誤unknown parameter -m
你知道是否有辦法用GDB進行調試?
是的,只要使用insmod將init_module函數加載到內核,就會調用它。 您只需添加一行printk,並在插入模塊后立即驗證是否正在打印。
您不能傳遞諸如-m之類的參數來調試內核模塊。
您只能使用MODULE_PARAMS傳遞要在您編寫的內核模塊中處理的參數。
QEMU + GDB步驟調試module_init
在嘗試使用module_init
之前首先獲得內核模塊QEMU + GDB調試一般工作: 如何使用QEMU調試Linux內核模塊?
module_init
更難,因為我們不知道內核模塊在它之前會被加載到何處。
然后,這里有兩個非理想但可用的技術來打破module_init
:
找到模塊加載地址,稍后重復使用。
每次啟動后模塊加載位置都是確定的,因此我們可以找到:
.text
部分的基地址: 如何獲取使用insmod插入的內核模塊的地址?
.text
部分中module_init
符號的位置:
./readelf -s fops.ko | grep myinit
然后,添加它們,並告訴GDB在那時斷開。
進入module_init
調用。
在內核4.16上,首先在:
do_init_module
然后步驟直到:
ret = fn();
然后進入,你進入module_init
函數。
此QEMU + Buildroot設置可用於方便地測試這兩種方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.