2016-01-06 4 views
2

Всякий раз, когда я помещаю какие-либо утверждения printk в блок if-else, он просто сбой ядра в 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

I d oubt авария имеет какое-либо отношение к вызовам 'printk'. Вероятно, у вас есть некоторые нарушения доступа (* UB *) в другом месте, и это проявляется, когда вы вызываете 'printk'. –

+0

Да, я не уверен в аварии, так как я использую шпатлевку для RDP на удаленном сервере. Поэтому всякий раз, когда я использую printk внутри некоторого блока if-else (НЕ ВСЕ), он просто не отвечает, когда я делаю insmod. Кроме того, в printk я просто печатаю строку, и я даже не пытаюсь напечатать значение переменной. Поэтому я думаю, что это связано с утверждениями printk. – user3243499

+0

Сбой ядра обычно печатает точную ошибку и трассировку стека на консоли. – stark

ответ

0

Есть некоторые случаи, когда printk не следует называть см

http://lkml.iu.edu/hypermail/linux/kernel/0606.1/2198.html

и

printk inside an interrupt handler , is it really that bad?

Так что, если весь ваш код в таких случаях, то избежать printK() попробовать с другой альтернативной вариант dev_dbg() или trace_printk()

+0

Это простой человек с блоком IF-ELSE. Клянусь, это точный код, который я использую (за исключением внесенных изменений в условие device->, но это часть оператора условия). Внутренний блок тот же. Кроме того, я просто попробовал метод trace_printk(), и он также показывает ту же проблему. – user3243499

+0

Еще одна вещь Джегар, можете ли вы рассказать мне причину следующего события. Когда я снова подключился к удаленному серверу через 30 секунд после возникновения этой проблемы, все файлы, такие как файлы Module.symvers, * ko etc, удаляются, как если бы я выпустил команду make clean. Почему это? – user3243499

+0

Когда авария случится после этого, может быть, ваша удаленная система перезагрузится. и init service, должно быть какое-то правило для очистки этих файлов. Что ваша система на пульте дистанционного управления? дополнять систему x86? пробовал/proc/kmsg? –

Смежные вопросы