2009-11-19 3 views
18

Линейная машина замораживается через несколько часов после загрузки и запуска программного обеспечения (включая пользовательские драйверы). Я ищу метод для отладки такой проблемы. Недавно был достигнут значительный прогресс в методах отладки Linux Kernel, не так ли?Текущие методы отладки ядра Linux

Прошу поделиться опытом по этой теме.

+0

@tinkertim: вы имеете в виду, что этого недостаточно? :) – leppie

ответ

5

SystemTap похоже, что Linux для Dtrace для Solaris. Однако я считаю его довольно враждебным. Тем не менее, вы можете попробовать. NB: скомпилируйте ядро ​​с информацией об отладке и потратьте некоторое время на крючки инструментов ядра.

Именно поэтому многие из них все еще используют printk() после эмпирического сужения ошибки до определенного модуля.

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

+1

+1 для ссылки на SystemTrap. Выглядит многообещающе. Я один из этих ребятишек. – dmeister

2

Существует множество разнообразных методов в зависимости от проблем, которые вы хотите отлаживать. В вашем случае первый вопрос: «действительно ли система заморожена?». Вы можете включить волшебный ключ sysrq и проверить состояние системы при замораживании и перейти оттуда.

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

6

Если вы можете воспроизвести проблему внутри виртуальной машины, действительно существует довольно новая (AFAIK) техника, которая может быть полезна: отладка виртуальной машины от хост-машины, на которой она выполняется.

Смотрите, например так: Debugging Linux Kernel in VMWare with Windows host

VMware Workstation 7 также позволяет мощную технику, которая позволяет записывать исполнение системы детерминировано, а затем воспроизвести его по своему желанию, даже в обратном направлении. Поэтому, как только система выйдет из строя, вы можете вернуться назад и посмотреть, что происходит тогда (и даже попытаться что-то изменить и посмотреть, не портится ли она). IIRC Я читал где-то, что вы не можете этого сделать, и отлаживать ядро ​​с помощью VMware/gdb одновременно.

Очевидно, для этого вам нужен VMM. Я не знаю, что поддерживает VMM, кроме VMM VMM, и я не знаю, поддерживают ли какие-либо бесплатные версии VMware. Вероятно, нет; нельзя ожидать, что коммерческая компания будет бесплатно раздавать все. Пробная версия составляет 30 дней.

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

+0

Примечание. Это не требует включения какой-либо поддержки отладки внутри виртуальной машины; сама ВМ не нарушена и теоретически совершенно не осознает, что ее отлаживают. Вместо этого на рабочей станции встроен gdb-заглушка, которая управляет виртуализированным процессором. – Paul

0

Как я отлаживаю этот тип ошибок, должен был запустить мою ОС внутри VirtualBox и скомпилировать ядро ​​с помощью встроенного процессора kgdb. Затем я настраиваю последовательную консоль на VirtualBox, чтобы я мог gdb к ядру внутри ОС VirtualBox через последовательную консоль. В любое время, когда ОС зависает, так же как и волшебный ключ sysrq, я могу ввести ctrl-c на gdb, чтобы остановить и понять ядро ​​в этот момент времени.

Как правило, трассировка стека ядра слишком сложна, чтобы точно определить процесс преступника, поэтому лучший способ, по-моему, по-прежнему является общей «верхней» командой, просто глядя на журналы приложений, чтобы узнать, в чем причина зависания - это понадобится Конечно, перезагрузите журнал.

0

Один из вариантов - использовать Kprobes. Быстрый поиск в Google покажет вам всю необходимую информацию. Это не особенно сложно использовать. Kprobes был создан IBM, я считаю, что это решение для отладки ядра.Это, по сути, сложная форма printk(), но она позволяет обрабатывать любые «точки останова», которые вы вставляете с помощью обработчиков. Возможно, это то, что вы ищете. Все, что вам нужно сделать, это написать и «insmod» модуль в ядро, которое будет обрабатывать любые «точки останова», которые вы укажете в модуле.

Надеюсь, что это может быть полезным вариантом ...

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