如何调试Linux内核模块`init()`中的问题?

如何调试Linux内核模块`init()`中的问题?,linux,remote-debugging,kernel-module,debug-symbols,Linux,Remote Debugging,Kernel Module,Debug Symbols,我正在使用remote(k)gdb调试模块中的一个问题,该问题在加载时会导致死机,例如调用init()时 堆栈跟踪只是显示,do\u one\u initcall(mod->init)导致崩溃。为了在gdb中加载符号文件,我需要获取模块文本部分的地址,为了获取该地址,我需要加载模块 因为busybox(1.16.1)中的insmod不支持-m,所以我坚持使用grep modulename/proc/modules+添加从nm的偏移量来计算地址 因此,我在这里面临着一种鸡和蛋的问题-为了能够调试模

我正在使用remote(k)gdb调试模块中的一个问题,该问题在加载时会导致死机,例如调用
init()

堆栈跟踪只是显示,
do\u one\u initcall(mod->init)
导致崩溃。为了在gdb中加载符号文件,我需要获取模块文本部分的地址,为了获取该地址,我需要加载模块

因为busybox(1.16.1)中的
insmod
不支持
-m
,所以我坚持使用
grep modulename/proc/modules
+添加从
nm
的偏移量来计算地址

因此,我在这里面临着一种鸡和蛋的问题-为了能够调试模块加载,我需要加载模块-但是为了加载模块,我需要调试问题

因此,我目前正在考虑两种选择——是否有办法获取地址信息:

  • 通过模块初始化代码中的printk()
  • 在内核代码中的某个地方使用printk()

  • 在调用
    mod->init()
    -这样我就可以在那里放置一个断点,加载符号文件,点击c,看到它崩溃并烧掉…

    你能把代码构建到内核中而不是作为一个模块吗?这可能会简化调试
    init()
    调用


    您还可以在
    do\u one\u initcall()
    设置断点,并查看
    mod->init
    的地址以获取加载地址

    将代码编译到内核中会太麻烦(每次都需要刷新主板,而不是将wget编译到ramdisk)。闯入
    do_one_initcall()
    有助于查明问题,因此我可以将崩溃推迟到启动与模块通信的用户模式进程。谢谢