Современные методы отладки ядра Linux - PullRequest
20 голосов
/ 19 ноября 2009

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

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

Ответы [ 5 ]

6 голосов
/ 13 февраля 2010

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

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

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

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

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

5 голосов
/ 19 ноября 2009

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

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

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

2 голосов
/ 20 ноября 2009

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

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

0 голосов
/ 24 февраля 2012

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

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

0 голосов
/ 31 октября 2011

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

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

...