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

C 导致内核崩溃的内核模块打印语句,c,linux,linux-kernel,C,Linux,Linux Kernel,每当我在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 {

每当我在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


我想知道这种行为的可能原因,以及如何删除这些内容。

有些情况下不应调用printk,请参见


因此,如果您的整个代码都在这种情况下,请避免
printK()
尝试使用其他可选选项
dev_dbg()
trace_printK()

我怀疑崩溃与
printK
调用有关。您可能在其他地方遇到了一些访问冲突(UB),当您调用
printk
时它就会显现出来。是的,我不确定是否会发生崩溃,因为我正在使用putty对远程服务器进行RDP。所以,每当我在某些if-else块(不是全部)中使用printk时,当我使用insmod时,它根本不响应。另外,在printk中,我只是打印一个字符串,甚至没有打印变量的值。因此,我认为这与printk语句有关。kernel崩溃通常会在控制台上打印准确的错误和堆栈跟踪。您是否认为
设备
不能为
?如果没有内核堆栈跟踪,很难说。使用所有3个printk,您看到问题了吗?或者只有这3个中的任何一个,你看到这个问题了吗?试着缩小原因陈述的范围……这只是一个简单的IF-ELSE阻塞人。我发誓这就是我正在使用的代码(除了在设备->条件中做了一些更改,但这是条件语句的一部分)。内部块是相同的。另外,我刚刚尝试了trace_printk()方法,它也显示了相同的问题。还有一件事,Jeegar,你能告诉我下面事件的原因吗。当我在该问题发生30秒后重新连接到远程服务器时,所有文件(如Module.symvers、*ko等)都会被删除,就好像我发出了make clean命令一样。这是为什么?当崩溃发生后,可能是你的远程系统重新启动它自己。初始化服务应该有一些规则来清理这些文件。你的远程系统是什么?Completerx86系统?尝试使用/proc/kmsg?这是一个x64 SLES系统