Отладка расширения ядра с GDB
В этом учебном руководстве Вы изучаете, как отладить kext. Вы устанавливаете среду отладки с двумя машинами и используете GDB для выполнения удаленной отладки. Если Вы еще не создали kext, полное Создание Универсального Расширения ядра с XCode или Создания Драйвера устройства с XCode прежде, чем завершить это учебное руководство. Если Вы незнакомы с GDB, посмотрите Отладку с GDB.
Несмотря на то, что это учебное руководство записано с драйвером устройства как пример, шаги для отладки подобны для отладки любого типа kext.
План действий
Вам нужны две машины для удаленной отладки: целевая машина и машина разработки. Вы загружаете и выполняете kext на целевой машине и отлаживаете kext на машине разработки. Важно держать эти две машины в стороне в Вашем уме, поскольку Вы работаете через это учебное руководство, потому что Вы будете двигаться вперед-назад между ними много раз. Может помочь, берете ли Вы листок бумаги, рвете его в половине и пишете «Разработку» на одной части и «Target» на другом. Тогда поместите листки бумаги рядом с этими двумя машинами.
Это существенные шаги, которые Вы выполните:
Предварительная установка
Подготовьте машины
Подготовьте эти две машины путем выполнения следующего:
Гарантируйте, что машины выполняют ту же версию OS X.
Гарантируйте, что машины подключены к той же сети с их встроенными портами Ethernet.
Гарантируйте, что Вы зарегистрированы как администратор на обеих машинах, который необходим для использования
sudo
команда.Смонтируйте образ диска Кернеля Дебуга Кита на машине разработки. Загрузите Кернеля Дебуга Кита с веб-сайта Разработчика Apple под категорией загрузки OS X. Удостоверьтесь Кернель Дебуг Кит, которого Вы загружаете, соответствует версию OS X, установленного на Вашей целевой машине.
Для получения дополнительной информации о Наборе Отладки Ядра посмотрите Чтение Меня файл, включенный в образ диска.
Если Ваша целевая машина выполняет Сервер OS X, отключите сторожевой таймер Сервера OS X.
$ sudo killall -TERM watchdogtimerd
Для получения дополнительной информации см. страницу руководства для
watchdogtimerd
.
(Машина разработки), саботируют расширение ядра
Для лучше моделирования реального kext отладка сценария Вам нужен Ваш kext для создания паники ядра. Самый простой способ сделать это должно разыменовать нулевого указателя.
В XCode добавьте следующий код к своему водительскому
start
метод (при отладке универсального kext добавьте его к kext’sMyKext_start
функция):char *kernel_panic = NULL;
char message = *kernel_panic;
Восстановите свой kext. В Терминальном приложении создайте копию kext как корень:
$ sudo cp -R MyDriver.kext /tmp
Скопируйте свой kext’s
dSYM
файл (в папке сборки проекта XCode с Вашим kext) к тому же расположению Вы копируете свой kext.Передайте копию своего kext с машины разработки на целевую машину.
Если переданная копия Вашего kext имеет неправильного владельца или группу, исправьте его со следующей командой:
$ sudo chown -R root:wheel MyDriver.kext
(Машина Target), включают отладку ядра
Прежде чем можно будет отладить kext, необходимо сначала включить отладку ядра. На целевой машине сделайте следующее:
Запустите Терминальное приложение.
Установите флаги отладки ядра.
Для включения отладки ядра необходимо установить NVRAM (энергонезависимая оперативная память) переменная:
$ sudo nvram boot-args="debug=0x144 -v"
Password:
Для получения дополнительной информации об отладке флагов посмотрите Создание и Отладку Ядер в Руководстве по программированию Ядра.
Перезапустите компьютер для флагов отладки для вступления в силу.
Запустите GDB и подключите эти две машины
(Машина Target), получают IP-адрес машины Target
Для соединения с целевой машиной от машины разработки Вам нужен IP-адрес целевой машины. Если Вы уже не знаете это, можно найти его в области Network приложения Установок системы.
(Машина разработки), запускают GDB
Запустите GDB со следующей команды, указав архитектуру целевой машины и расположение Вашего ядра отладки:
$ gdb -arch i386 /Volumes/KernelDebugKit/mach_kernel
Добавьте специфичные для ядра макросы от Набора Отладки Ядра до Вашего сеанса GDB.
(gdb) source /Volumes/KernelDebugKit/kgmacros
Сообщите GDB, что Вы собираетесь быть отладкой kext удаленно.
(gdb) target remote-kdp
(Машина Target), загружают расширение ядра
Вы готовы загрузить свой kext и вызвать панику ядра. Сделайте так со следующей командой:
$ sudo kextutil MyDriver.kext |
Паника ядра должна сразу произойти. Интерактивность прекращается, и текст отладки появляется на экране, включая текст Awaiting debugger connection
.
(Машина разработки), присоединяют к машине Target
Теперь можно сказать GDB присоединять к целевой машине. На машине разработки сделайте следующее:
Присоедините к целевой машине. При подсказке GDB используйте
kdp-reattach
макрос с именем целевой машины или IP-адресом:(gdb) kdp-reattach target.apple.com
Целевая печать машины:
Connected to remote debugger.
(Машина разработки), получают адрес загрузки расширения ядра
Вам нужен адрес загрузки Вашего kext для генерации файла символов для него. Введите следующее при подсказке GDB:
(gdb) showallkmods |
Список появляется, выводя на экран информацию о каждой работе kext целевой машины. Найдите свой kext в списке и запишите значение в столбце адреса. Обратите внимание на то, что значения в kmod и столбцах размера выглядят подобными значению адреса, поэтому удостоверьтесь, что у Вас есть правильное значение.
(Машина разработки), создают и загружают файл символов
Можно создать файл символов для kext на машине разработки с kextutil
команда. Еще раз удостоверьтесь, что версия Набора Отладки Ядра, который Вы обеспечиваете, соответствует версию OS X на целевой машине.
Откройте второе Окно терминала.
Создайте файл символов.
Скорректируйте путь к Набору Отладки Ядра, путь к Вашему kext и архитектуру ядра как надлежащие. Путь после
-s
опция указывает выходной каталог, где записан файл символов. Это должно быть каталогом, Вы скопировали свой kext иdSYM
файл к.-n
опция препятствует тому, чтобы команда загрузила kext в ядро.sudo kextutil -s /tmp -n -arch i386 -k /Volumes/KernelDebugKit/mach_kernel -e -r /Volumes/KernelDebugKit /tmp/MyDriver.kext
kextutil
инструмент предлагает Вам адрес загрузки Вашего kext. Обеспечьте загрузка адресуют Вас полученный на предыдущем шаге.Когда Вы заканчиваете, файл символов находится в выходном каталоге, который Вы указали. Имя файла является идентификатором пакета kext с
.sym
расширение.При подсказке GDB укажите расположение файла символов.
Снова, удостоверьтесь, что файл символов находится в той же папке как копия Вашего kext и
dSYM
файл.(gdb) set kext-symbol-file-path /tmp
При подсказке GDB добавьте свой kext к среде отладки со следующим макросом:
(gdb) add-kext /tmp/MyDriver.kext
Если Вы хотите добавить файл символов kext, GDB спрашивает Вас. Когда Вы подтверждаете, это загружает символы.
Отладьте расширение ядра
(Машина разработки) отладка с GDB
Теперь Вы готовы начать отлаживать! Запросите след от GDB определить местоположение источника паники:
(gdb) bt |
Список стековых фреймов появляется. Стековый фрейм Вашего kext, вызвавший панику, должен быть легко идентифицируемым как о пятом кадре от вершины. Когда Вы отлаживаете свою собственную панику ядра и не знаете причины, можно теперь ввести незаконный стековый фрейм и выяснить то, что точно вызвало панику.
(Машина разработки), останавливают отладчик
Когда Вы закончите отлаживать, остановите отладчик путем выхода из GDB.
(gdb) quit |
Концы сеанса отладки. Поскольку целевая машина все еще испугана, необходимо перезагрузить ее. Когда Вы регистрируете назад в целевую машину, она выводит на экран следующее сообщение:
Нажмите Ignore.
Куда пойти затем
Поздравления! Вы изучили, как установить среду отладки с двумя машинами для отладки kext с GDB. Чтобы изучить, как упаковать Ваш kext для установки Вашими клиентами, считайте Упаковку Расширения ядра для Распределения и Установки.