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

Kim*_*ais 3 linux remote-debugging kernel-module debug-symbols

我正在使用远程(k)gdb来调试模块中的问题,该模块在加载时会引起恐慌,例如何时init()被调用.

堆栈跟踪只显示do_one_initcall(mod->init)导致崩溃.为了获得在gdb中加载的符号文件,我需要获取模块文本部分的地址,并获得我需要加载模块.

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

所以我在这里面临一个鸡和蛋的问题 - 为了能够调试模块加载,我需要加载模块 - 但是为了加载模块,我需要调试问题. ..

所以我目前正在考虑两种选择 - 是否有办法获取地址信息:

  1. 通过模块初始化代码中的printk()
  2. 通过printk()在内核代码中的某个地方

所有这一切都在调用之前mod->init()- 所以我可以在那里放置一个断点,加载符号文件,点击c并看到它崩溃和燃烧......

Jay*_*ayM 5

您可以将代码构建到内核而不是模块中吗?这可能会简化init()呼叫调试.

您还可以设置断点do_one_initcall()并查看地址mod->init以获取加载地址.