如何调试Linux内核模块`init()`中的问题?
问题描述:
我正在使用远程(k)gdb调试模块中的问题,导致加载时出现恐慌,例如,当调用init()
时。如何调试Linux内核模块`init()`中的问题?
堆栈跟踪只显示do_one_initcall(mod->init)
导致崩溃。为了获得加载到gdb中的符号文件,我需要获取模块文本部分的地址,并获得我需要加载的模块。
因为BusyBox中的insmod
(1.16.1)不支持-m
所以我坚持到grep modulename /proc/modules
+添加来自nm
偏移找出地址。
所以我在这里面对一种鸡和一个鸡蛋的问题 - 为了能够调试模块加载,我需要加载模块 - 但为了获得模块加载,我需要调试问题...
所以我目前考虑两个选择 - 是否有一种方式来获得地址信息之一:
- 通过的printk()在模块初始化代码
- 通过的printk ()内核代码
所有调用此之前mod->init()
- 这样我就可以把一个断点,装载符号文件,打Ç,看看它和好如初......
答
你可以建立你的代码到内核中而比作为一个模块?这可能会简化调试init()
调用。
您也可以在do_one_initcall()
处设置断点并查看地址mod->init
以获取加载地址。
将代码编译到内核中会太繁琐(每次都需要闪烁电路板而不是wget到ramdisk)。打破'do_one_initcall()'足以帮助查明问题,以便我可以推迟崩溃,直到开始与模块通信的用户模式进程。谢谢。 – Kimvais 2010-04-12 13:05:20