2010-04-09 59 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