3

我正在迈出 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 进行调试吗?

4

2 回答 2

4

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

您不能传递诸如 -m 之类的参数来调试内核模块。

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

于 2012-08-09T17:26:32.457 回答
2

QEMU + GDB 分步调试module_init

在尝试之前首先让内核模块 QEMU + GDB 调试正常工作module_init如何使用 QEMU 调试 Linux 内核模块?

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

然后,这里有两种非理想但可用的技术来闯入module_init

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

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

    然后,把它们加起来,然后告诉 GDB 在那个时候中断。

  2. 进入module_init通话。

    在内核 4.16 上,首先中断:

    do_init_module
    

    然后一步直到:

    ret = fn();
    

    然后踏入其中,您就会陷入该module_init功能。

QEMU + Buildroot 设置可用于方便地测试这两种方法。

于 2018-04-15T10:46:38.530 回答