Отладка зависания ядра

Я пытаюсь запустить приложение, использующее драйвер режима ядра. Система зависает каждый час, и единственный способ восстановить ее — полный сброс. Sysrq перестает отвечать на запросы, сеансы telnet зависают, сообщений об ошибках нет. К сожалению, на плате нет поддержки ejtag. Я пытался функционально изолировать его, но это все равно, что искать иголку в стоге сена. Какие-либо предложения?

PS: Это система mips linux (2.6.31).


person l.thee.a    schedule 07.05.2010    source источник
comment
Мне интересно - в чем была проблема?   -  person jbarlow    schedule 18.06.2010
comment
Он застревал в часто используемой спин-блокировке. Вместо этого начал использовать spin_lock_irq. Мы нашли проблему, записав сообщения во временную ячейку памяти.   -  person l.thee.a    schedule 30.06.2010


Ответы (3)


Вот несколько вариантов, в зависимости от специфики вашей ситуации. Если вы можете предоставить более подробную информацию о платформе и характере драйвера режима ядра, это было бы полезно.

Предполагая, что у вас есть основания быть уверенным в аппаратном обеспечении, вероятными источниками зависаний являются проблемы блокировки в ядре, неинициализированные переменные и бесконечные циклы с отключенным вытеснением.

Можете ли вы настроить прерывание таймера для периодического запуска и мигания светодиода? Возможно, вам будет полезно посмотреть, продолжают ли обрабатываться прерывания во время блокировки.

Включите обнаружение программной блокировки в меню взлома ядра Linux и любые другие соответствующие функции взлома ядра. Linux может потребоваться минута или две, чтобы обнаружить программную блокировку и сообщить о ней. Вы ждали достаточно долго, чтобы проверить это?

Включите проверку зависимостей блокировки при взломе ядра и исправьте все обнаруженные ошибки блокировки в вашем драйвере.

Попробуйте изменить режим вытеснения ядра. Это изменяет поведение некоторых системных блокировок, в некоторых случаях превращая взаимоблокировки в менее опасные блокировки. Если это актуально/возможно, отключите SMP.

person jbarlow    schedule 17.06.2010

К сожалению, без работы sysreq или какого-либо способа взлома базовой системы вам не повезло.

Если вы можете получить какое-то поведение из системы (возможно, аппаратный сторожевой таймер?), Я бы порекомендовал kdump.

Кроме того, если это недавняя проблема, начните с разделения кода драйвера пополам, чтобы определить, где происходит сбой.

person Yann Ramin    schedule 07.05.2010

Если ядро ​​не полностью зависло и вы все еще получаете прерывания, вы можете использовать KGDB.

Если вы не можете этого сделать, вы можете добавить в драйвер дополнительный код регистрации, чтобы отследить источник проблемы. Я бы поставил printk() как минимум на вход каждой функции и, возможно, на каждый выход каждой функции. По крайней мере, это должно помочь вам выяснить, где происходит проблема.

person JayM    schedule 17.06.2010