Подтвердить что ты не робот

Текущие методы отладки ядра Linux

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

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

4b9b3361

Ответ 1

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

См. например: Отладка ядра Linux в VMWare с хостом Windows

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

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

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

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

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

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