Отладка расширения ядра с GDB

В этом учебном руководстве Вы изучаете, как отладить kext. Вы устанавливаете среду отладки с двумя машинами и используете GDB для выполнения удаленной отладки. Если Вы еще не создали kext, полное Создание Универсального Расширения ядра с XCode или Создания Драйвера устройства с XCode прежде, чем завершить это учебное руководство. Если Вы незнакомы с GDB, посмотрите Отладку с GDB.

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

План действий

Вам нужны две машины для удаленной отладки: целевая машина и машина разработки. Вы загружаете и выполняете kext на целевой машине и отлаживаете kext на машине разработки. Важно держать эти две машины в стороне в Вашем уме, поскольку Вы работаете через это учебное руководство, потому что Вы будете двигаться вперед-назад между ними много раз. Может помочь, берете ли Вы листок бумаги, рвете его в половине и пишете «Разработку» на одной части и «Target» на другом. Тогда поместите листки бумаги рядом с этими двумя машинами.

Это существенные шаги, которые Вы выполните:

  1. Предварительная установка

  2. Запустите GDB и подключите эти две машины

  3. Отладьте расширение ядра

Предварительная установка

Подготовьте машины

Подготовьте эти две машины путем выполнения следующего:

  1. Гарантируйте, что машины выполняют ту же версию OS X.

  2. Гарантируйте, что машины подключены к той же сети с их встроенными портами Ethernet.

  3. Гарантируйте, что Вы зарегистрированы как администратор на обеих машинах, который необходим для использования sudo команда.

  4. Смонтируйте образ диска Кернеля Дебуга Кита на машине разработки. Загрузите Кернеля Дебуга Кита с веб-сайта Разработчика Apple под категорией загрузки OS X. Удостоверьтесь Кернель Дебуг Кит, которого Вы загружаете, соответствует версию OS X, установленного на Вашей целевой машине.

    Для получения дополнительной информации о Наборе Отладки Ядра посмотрите Чтение Меня файл, включенный в образ диска.

  5. Если Ваша целевая машина выполняет Сервер OS X, отключите сторожевой таймер Сервера OS X.

    $ sudo killall -TERM watchdogtimerd

    Для получения дополнительной информации см. страницу руководства для watchdogtimerd.

(Машина разработки), саботируют расширение ядра

Для лучше моделирования реального kext отладка сценария Вам нужен Ваш kext для создания паники ядра. Самый простой способ сделать это должно разыменовать нулевого указателя.

  1. В XCode добавьте следующий код к своему водительскому start метод (при отладке универсального kext добавьте его к kext’s MyKext_start функция):

    char *kernel_panic = NULL;
    char message = *kernel_panic;
  2. Восстановите свой kext. В Терминальном приложении создайте копию kext как корень:

    $ sudo cp -R MyDriver.kext /tmp
  3. Скопируйте свой kext’s dSYM файл (в папке сборки проекта XCode с Вашим kext) к тому же расположению Вы копируете свой kext.

  4. Передайте копию своего kext с машины разработки на целевую машину.

    Если переданная копия Вашего kext имеет неправильного владельца или группу, исправьте его со следующей командой:

    $ sudo chown -R root:wheel MyDriver.kext

(Машина Target), включают отладку ядра

Прежде чем можно будет отладить kext, необходимо сначала включить отладку ядра. На целевой машине сделайте следующее:

  1. Запустите Терминальное приложение.

  2. Установите флаги отладки ядра.

    Для включения отладки ядра необходимо установить NVRAM (энергонезависимая оперативная память) переменная:

    $ sudo nvram boot-args="debug=0x144 -v"
    Password:

    Для получения дополнительной информации об отладке флагов посмотрите Создание и Отладку Ядер в Руководстве по программированию Ядра.

  3. Перезапустите компьютер для флагов отладки для вступления в силу.

Запустите GDB и подключите эти две машины

(Машина Target), получают IP-адрес машины Target

Для соединения с целевой машиной от машины разработки Вам нужен IP-адрес целевой машины. Если Вы уже не знаете это, можно найти его в области Network приложения Установок системы.

(Машина разработки), запускают GDB

  1. Запустите GDB со следующей команды, указав архитектуру целевой машины и расположение Вашего ядра отладки:

    $ gdb -arch i386 /Volumes/KernelDebugKit/mach_kernel
  2. Добавьте специфичные для ядра макросы от Набора Отладки Ядра до Вашего сеанса GDB.

    (gdb) source /Volumes/KernelDebugKit/kgmacros
  3. Сообщите GDB, что Вы собираетесь быть отладкой kext удаленно.

    (gdb) target remote-kdp

(Машина Target), загружают расширение ядра

Вы готовы загрузить свой kext и вызвать панику ядра. Сделайте так со следующей командой:

$ sudo kextutil MyDriver.kext

Паника ядра должна сразу произойти. Интерактивность прекращается, и текст отладки появляется на экране, включая текст Awaiting debugger connection.

(Машина разработки), присоединяют к машине Target

Теперь можно сказать GDB присоединять к целевой машине. На машине разработки сделайте следующее:

  1. Присоедините к целевой машине. При подсказке 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 на целевой машине.

  1. Откройте второе Окно терминала.

  2. Создайте файл символов.

    Скорректируйте путь к Набору Отладки Ядра, путь к Вашему 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 расширение.

  3. При подсказке GDB укажите расположение файла символов.

    Снова, удостоверьтесь, что файл символов находится в той же папке как копия Вашего kext и dSYM файл.

    (gdb) set kext-symbol-file-path /tmp
  4. При подсказке GDB добавьте свой kext к среде отладки со следующим макросом:

    (gdb) add-kext /tmp/MyDriver.kext

    Если Вы хотите добавить файл символов kext, GDB спрашивает Вас. Когда Вы подтверждаете, это загружает символы.

Отладьте расширение ядра

(Машина разработки) отладка с GDB

Теперь Вы готовы начать отлаживать! Запросите след от GDB определить местоположение источника паники:

(gdb) bt

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

(Машина разработки), останавливают отладчик

Когда Вы закончите отлаживать, остановите отладчик путем выхода из GDB.

(gdb) quit

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

../art/problem.jpg

Нажмите Ignore.

Куда пойти затем

Поздравления! Вы изучили, как установить среду отладки с двумя машинами для отладки kext с GDB. Чтобы изучить, как упаковать Ваш kext для установки Вашими клиентами, считайте Упаковку Расширения ядра для Распределения и Установки.