内核模块打印语句导致内核崩溃

3
每当我在if-else块中放置任何printk语句时,它会导致Linux内核崩溃。
以下是示例代码:
if (device-> Some condition) {
        s = 0;
        e = 0;
        printk(KERN_INFO "I am 0 and 0 part \n");
        printk(KERN_ALERT "KERN_INFO Successfully registered module \n");
} else {
        s = 1;
        e = 2;
        printk(KERN_INFO "I am in 1 and 1 part \n");
}

上述代码在我进行编译时成功了。但是当我使用 insmod 时,内核停止响应并最终崩溃。相反,如果我注释掉那些 printk 语句,那么我就可以轻松地进行 insmod
我想知道这种行为的可能原因以及如何去除这些问题。

4
我怀疑崩溃与printk调用无关。你可能在其他地方存在一些访问违规(UB),并且当你调用printk时它会显示出来。 - P.P
内核崩溃通常会在控制台上打印出确切的错误信息和堆栈跟踪。 - stark
1
你确定 device 不可能是 NULL 吗?没有内核堆栈跟踪很难说。 - sheikh_anton
你能确认问题是在所有三个 printk 中出现,还是只有其中一个?试着缩小引起问题的语句范围... - Jeegar Patel
我没有物理访问服务器的权限。我使用“putty”远程登录。因此,在这种情况下,由于致命错误,putty停止响应并变得不活跃。大约30秒后,我可以重新连接到远程Linux服务器。因此,我认为内核崩溃并恢复了。 - user3243499
显示剩余4条评论
1个回答

0

这只是一个简单的IF-ELSE代码块,我发誓这就是我正在使用的确切代码(除了在设备->条件中进行了一些更改,但那是条件语句的一部分)。块内部是相同的。 此外,我刚刚尝试了trace_printk()方法,它也显示了相同的问题。 - user3243499
Jeegar,还有一件事,你能告诉我以下事件的原因吗? 当我在问题发生后30秒重新连接到远程服务器时,所有文件(如Module.symvers、*ko等文件)都会被删除,就好像我已经执行了make clean命令。这是为什么? - user3243499
当崩溃发生后,远程系统可能会自行重启。并且在初始化服务时,应该有一些规则来清理这些文件。你的远程系统是什么?完整的x86系统吗?尝试使用/proc/kmsg了吗? - Jeegar Patel
这是一个 x64 SLES 系统。 - user3243499

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接