如何调试Linux内核模块的init_module()调用?

时间:2012-08-09 17:03:04

标签: linux debugging linux-kernel kernel-module

我正在进行Linux内核开发的第一步。 我有一些代码生成.ko内核模块,我用insmod安装。我想要一种方法来调试安装模块时会发生什么,但我遇到了一些困难。

  1. 我需要调试init_module的调用。我运行insmode时会调用此函数吗?

  2. 我尝试使用insmod "/my/url/fil.ko" -m来调试发生了什么,但每次在-1 Unknown symbol in module中出现错误/cat/log/message时,我都会看到错误unknown parameter -m

  3. 您知道是否有办法使用GDB进行调试?

2 个答案:

答案 0 :(得分:4)

是的,一旦使用insmod将init_module函数加载到内核,就会调用它。您只需添加一行printk,并在插入模块后立即验证它是否正在打印。

您无法传递-m等参数来调试内核模块。

您只能使用MODULE_PARAMS传递要在您编写的内核模块中处理的参数。

答案 1 :(得分:1)

QEMU + GDB步骤调试module_init

首先获取内核模块QEMU + GDB调试一般工作,然后再尝试module_initHow to debug Linux kernel modules with QEMU?

module_init更难,因为我们不知道内核模块在加载之前会在哪里加载。

然后,这里有两种非理想但可用的技术可以分解为module_init

  1. 找到模块加载地址,稍后再重复使用。

    模块加载位置在每次启动后都是确定的,因此我们可以找到:

    然后,将它们加起来,告诉GDB在那时断开。

  2. 进入module_init来电。

    在内核4.16上,先打破:

    do_init_module
    

    然后步骤直到:

    ret = fn();
    

    然后进入那个,你进入module_init函数。

  3. QEMU + Buildroot setup可用于方便地测试这两种方法。