Spec-Zone .ru
спецификации, руководства, описания, API
Библиотека разработчика Mac Разработчик
Поиск

Дампы ядра ядра

Этот technote объясняет, как можно включить удаленные дампы ядра ядра на Mac OS X 10.3 и позже. Дампы ядра ядра позволяют Вам исследовать состояние ядра после паники ядра или зависать. Можно использовать это для отладки проблемы ядра, когда обстоятельства препятствуют тому, чтобы Вы использовали отладчик ядра с двумя машинами.

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

Введение

Ядро Mac OS X никогда не должно паниковать, потому что, когда оно делает, оно серьезно причиняет беспокойство пользователю. Таким образом паника ядра всегда является результатом ошибки, или в коде Apple или в коде некоторого стороннего расширения ядра. Такие ошибки должны быть исследованы и разрешены.

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

  • Когда Вы пишете расширение ядра, и Вы встречаетесь с паникой ядра, можно обычно отлаживать проблему с отладчиком ядра с двумя машинами. Однако существуют обстоятельства, где это не возможно. Например, если тестер или конечный пользователь сообщат о проблеме, которую Вы не можете воспроизвести на своем рабочем столе — или потому что это нечасто происходит или потому что это только происходит с неясными аппаратными средствами или в нестандартной среде, то — Вы не будете в состоянии отладить использование стандартных инструментов. Если можно получить дамп ядра испуганного ядра и отладки с помощью того дампа ядра, при этих обстоятельствах полезно.

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

  • Наконец, если Вы управляете высоконадежным сервером Macintosh, и у Вас есть проблемы с паникой сервера, можно получить дамп ядра ядра, сразу перезапустить сервер, и затем отладить проблему оффлайн.

Для помощи Вам в этих ситуациях Apple предоставляет удаленную услугу дампа ядра ядра, присутствовавшую начиная с Mac OS X 10.3 для основанных на PowerPC систем Macintosh, и начиная с Mac OS X 10.4.7 для основанных на Intel систем Macintosh. Можно сконфигурировать компьютер Mac OS X так, чтобы, когда машина паникует, она передала дамп ядра ядра к серверу через TCP/IP. Сервер дампа ядра является демоном, собирающим дамп ядра ядра от клиента и пишущим его в диск. Можно тогда проанализировать дамп ядра с помощью множества инструментов, прежде всего GDB.

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

Примечание: Источник для сервера дампа ядра ядра является частью Дарвина (в network_cmds) проект). Должно быть выполнимо портировать этот сервер на другие подобные UNIX платформы, включая более ранние версии Mac OS X, несмотря на то, что такие усилия не покрыты этим техническим примечанием.

Это техническое примечание фокусируется на описании процесса дампа ядра через интернет-соединение. Соединение FireWire может также использоваться для передачи дампа ядра. FireWire является полезной альтернативой, когда паника ядра в клиентской системе включает встроенный драйвер Ethernet, или некоторая другая сеть кодирует таким образом, что дамп ядра не может быть отправлен через соединение Ethernet.

Чтение Меня файл в FireWire SDK для Mac OS X описывает процесс установки для использования FireWire для передачи дампа ядра. Можно получить доступ к FireWire SDK от Apple Developer Hardware & Drivers - веб-страница Загрузок.

Как только Вы преуспели в том, чтобы сохранить дамп ядра через соединение FireWire, можно узнать больше об анализе дампа ядра путем чтения раздела Debugging with Kernel Core Dumps.

Это техническое примечание предоставляет информацию о следующих задачах.

Назад к началу.

Конфигурирование сервера

Первый шаг в собирающихся дампах ядра ядра должен установить сервер дампа ядра ядра. Запустить Вас должно выбрать машину для действия как сервер, приняв во внимание следующие моменты.

  • Сервер дампа ядра ядра не является в вычислительном отношении дорогим; это будет работать легко на любой машине, способной к рабочему Mac OS X.

  • Дампы ядра ядра являются большими, обычно рабочими к порядку 200-500 + MB (это варьируется на основе размера карты ядра клиента, размера физической памяти, образцов использования, и т.д.). Ваш сервер должен иметь большое свободное пространство на диске.

  • Сервер должен иметь статический IP-адрес.

  • IP-адрес сервера должен быть видим всем клиентам. Вы не можете поместить сервер позади NAT или брандмауэр, если Ваши клиенты не находятся также позади того же NAT или брандмауэра.

WARNING: Для упрощения процесса установки, это техническое примечание предполагает, что клиент и сервер находится в надежной сети, и что Вы доверяете всем пользователям, у которых есть учетные записи на сервере.

Кроме того, когда клиент паникует, это передает содержание памяти ядра к серверу в ясном. Довольно возможно, что эти данные включают уязвимую информацию. Необходимо сконфигурировать сеть (использование, например, коммутируемые концентраторы, брандмауэр или VPN) так, чтобы эти данные не могли быть замечены посторонними людьми.

Для включения сервера дампа ядра ядра выполните следующие шаги:

Создание каталога дампа ядра

Для запуска необходимо создать каталог, в который сервер пишет дампы ядра. Тот каталог должен быть перезаписываем программой, это выводит ядро. Самый простой способ гарантировать это состоит в том, чтобы сделать его перезаписываемым всеми. Мы рекомендуем создать этот каталог с командами, показанными в Перечислении 1.

Перечисление 1: Создание каталога дампа ядра.

server$ sudo mkdir /PanicDumps
Password:********
server$ sudo chown root:wheel /PanicDumps
server$ sudo chmod 1777 /PanicDumps

Активация серверного процесса дампа ядра

Для Mac OS X 10.5 и больше, отключенный launchd файл списка свойств присутствует как часть установки базовой системы. com.apple.kdump.plist файл списка свойств предполагает, что Вы будете использовать /PanicDumps каталог для хранения дампов ядра ядра. Если Вы хотите использовать различный каталог, создать каталог с помощью подобных инструкций как показано в Перечислении 1, тогда изменяют /System/Library/LaunchDaemons/com.apple.kdump.plist файл списка свойств и обновление ProgramArguments свойство с полным путем к желаемому каталогу.

Для активации сервера использовать launchctl показанный в Перечислении 2. Это обновит файл списка свойств так, чтобы сервер дампа ядра всегда запустился автоматически через системные перезапуски.

Перечисление 2: Активация сервера дампа ядра.

server$ sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.kdumpd.plist
Password:********

Примечание:-w параметр launchctl удаляет disabled ключ от файла списка свойств и файла записывается обратно к диску. На будущих перезапусках будет всегда запускаться серверный процесс дампа ядра. Для получения дополнительной информации об опциях к launchctl, обратитесь к странице справочника для launchctl.

Можно проверить, что сервер дампа ядра активен при помощи launchctl list команда как показано в Перечислении 3.

Перечисление 3: Проверка сервера дампа ядра активна.

server$ sudo launchctl list | grep kdump
Password:********
 - 0     com.apple.kdumpd

Не может быть никакого PID, связанного с com.apple.kdumpd метка задания launchd как процесс просто еще может не быть активной. Состояние 0 значений указывают, что сервер готов к по требованию использованию.

Как только Вам сконфигурировали сервер правильно, можно продолжить на следующем шаге, Конфигурируя Клиент.

Назад к началу.

Конфигурирование Сервера Дампа ядра Ядра для Mac OS X до 10,5

Если у Вас есть машина сервера с версией Mac OS X до 10,5, существуют различные инструкции для следования. Для машины сервера с Mac OS X 10.4, следуйте инструкциям в разделе, Конфигурируя Сервер Дампа ядра Ядра для Mac OS X 10.4.x. Для машины сервера с Mac OS X 10.3, следуйте инструкциям в разделе, Конфигурируя Сервер Дампа ядра Ядра для Mac OS X 10.3.x.

Конфигурирование сервера дампа ядра ядра для Mac OS X 10.4.x

Процедура для установки сервера Дампа ядра Ядра под Mac OS X 10.4.x подобна процедуре для Mac OS X 10.5. Единственная разница - то, что launchd файл списка свойств не установлен по умолчанию, таким образом, необходимо создать его сами. Создайте launchd файл списка свойств, показанный в Перечислении 4. Эти инструкции предполагают, что Вы используете /PanicDumps каталог для хранения дампов ядра ядра. При использовании различного каталога необходимо будет заменить полным путем на тот каталог вместо ProgramArguments свойство строки /PanicDumps.

Перечисление 4: Создание Сервера launchd файл списка свойств

server$ sudo cat > /tmp/com.mycompany.kdump.plist
Password: ********
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>InitGroups</key>
    <true/>
    <key>Label</key>
    <string>com.mycompany.kdumpd</string>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/libexec/kdumpd</string>
        <string>/PanicDumps</string>
    </array>
    <key>Sockets</key>
    <dict>
        <key>Listener</key>
        <dict>
            <key>SockServiceName</key>
            <string>1069</string>
            <key>SockType</key>
            <string>dgram</string>
        </dict>
    </dict>
    <key>UserName</key>
    <string>nobody</string>
    <key>inetdCompatibility</key>
    <dict>
        <key>Wait</key>
        <true/>
    </dict>
</dict>
</plist>
^D
client$ ls -l /tmp/com.mycompany.kdump.plist
-rw-r--r-- 1 admin  wheel  831 Sep 10 15:25 /tmp/com.mycompany.kdump.plist
client$ sudo cp /tmp/com.mycompany.kdump.plist /Library/LaunchDaemons/
Password: ********
client$ ls -l /Library/LaunchDaemons/com.mycompany.kdump.plist
-rw-r--r-- 1 root  wheel  831 Sep 10 15:26 /Library/LaunchDaemons/com.mycompany.kdump.plist

Как только Вы имеете создаваемый launchd список свойств, перезапускаете систему. Серверный процесс дампа ядра должен быть активным на перезапуске. Можно проверить, что серверный процесс дампа ядра активен при помощи launchctl list команда как показано в Перечислении 5.

Перечисление 5: Проверка сервера дампа ядра активна для Mac OS X 10.4.x

server$ sudo launchctl list | grep kdump
Password:********
com.mycompany.kdumpd

Присутствие com.mycompany.kdumpd метка задания launchd указывает, что сервер дампа ядра готов к по требованию использованию.

Со сконфигурированным сервером сконфигурируйте клиент, как описано в Конфигурировании Клиента.

Назад к началу.

Конфигурирование сервера дампа ядра ядра для Mac OS X 10.3.x

Следуйте этим инструкциям для конфигурирования сервера Дампа ядра Ядра для Mac OS X 10.3. Эти инструкции предполагают, что Вы используете /PanicDumps каталог для хранения дампов ядра ядра. При использовании различного каталога необходимо будет заменить полным путем на тот каталог вместо /PanicDumps на последующих шагах.

Сконфигурируйте xinetd

Сконфигурируйте расширенного демона интернет-сервисов, xinetd, выполнять сервер, когда соединяется клиент. Скопируйте текст с Перечисления 6 в вызванный файл macosxkdump в /etc/xinetd.d каталог. Перечисление 7 показывает один способ сделать это.

Перечисление 6: Содержание 'macosxkdump' конфигурационного файла

service macosxkdump
{
    disable     = no
    type        = UNLISTED
    socket_type = dgram
    protocol    = udp
    port        = 1069
    user        = nobody
    groups      = yes
    server      = /usr/libexec/kdumpd
    server_args = /PanicDumps
    wait        = yes
}

Перечисление 7: Создание 'macosxkdump' файла

server$ cat > /tmp/macosxkdump
service macosxkdump
{
    disable     = no
    type        = UNLISTED
    socket_type = dgram
    protocol    = udp
    port        = 1069
    user        = nobody
    groups      = yes
    server      = /usr/libexec/kdumpd
    server_args = /PanicDumps
    wait        = yes
}
^D
server$ ls -l /tmp/macosxkdump
-rw-r--r-- 1 quinn  staff  278 14 Jul 15:25 /tmp/macosxkdump
server$ sudo cp /tmp/macosxkdump /etc/xinetd.d 
Password: ********
server$ ls -l /etc/xinetd.d/macosxkdump 
-rw-r--r-- 1 root  wheel  278 14 Jul 15:26 /etc/xinetd.d/macosxkdump

IMPORTANT: поддержать безопасность системы, конфигурационный файл (/etc/xinetd.d/macosxkdump) должны показать полномочия заключительной командой в Перечислении 7.

Сигнал xinetd

Необходимо отправить SIGHUP сигнализируйте к xinetd демон для него для распознавания изменений конфигурации. Перечисление 8 показывает, как сделать это. При вводе первой команды удостоверьтесь, что использовали одинарные левые кавычки (ASCII 96), не одинарные кавычки (ASCII 39).

Перечисление 8: Сигнализация xinetd

server$ sudo kill -HUP `cat /var/run/xinetd.pid`
Password: ********

Также можно просто перезагрузить также вызывающую машину, xinetd распознать новую конфигурацию.

Подтвердите конфигурацию

Можно подтвердить, что все сконфигурировано правильно с помощью одного из двух методов.

  • Если Вы посмотрите в системном журнале, то Вы будете видеть текст, подобный показанному в Перечислении 9, указывающем это xinetd запустил новую службу. Можно просмотреть системный журнал вручную (/var/log/system.log) или в Консольном приложении.

  • Можно отправить a SIGUSR1 сигнал к xinetd попросить, чтобы он вывел свою текущую конфигурацию. Перечисление 10 показывает, как сделать это. Демон добавляет информацию к /var/run/xinetd.dump. Необходимо видеть, что запись указывает что macosxkdump служба активна, подобна один показанный в Перечислении 11.

Перечисление 9: Системное подтверждение журнала

Jul 14 15:40:57 localhost xinetd[349]: Starting reconfiguration
Jul 14 15:40:57 localhost xinetd[349]: readjusting service ssh
Jul 14 15:40:57 localhost xinetd[349]: Reconfigured: new=1 old=1 dropped=0 (services)

Перечисление 10: Сигнализация xinetd для дампа ее конфигурации

server$ sudo kill -USR1 `cat /var/run/xinetd.pid`
Password: ********

Перечисление 11: xinetd выводят подтверждение

Service = macosxkdump
    State = Active
    Service configuration: macosxkdump
        id = macosxkdump
        flags = IPv4
        type = UNLISTED
        socket_type = dgram
        Protocol (name,number) = (udp,17)
        port = 1069
        wait = yes
        user = -2
        Groups = yes
        PER_SOURCE = -1
        Bind = All addresses.
        Server = /usr/libexec/kdumpd
        Server argv = kdumpd /PanicDumps
        Only from: All sites
        No access: No blocked sites
        Logging to syslog. Facility = daemon, level = info
        Log_on_success flags = HOST PID HOST
        Log_on_failure flags = HOST
    running servers = 0
    retry servers = 0
    attempts = 0
    service fd = 6

Как только Вам сконфигурировали сервер, можно сконфигурировать клиент, как описано в Конфигурировании Клиента.

Назад к началу.

Конфигурирование клиента

Для включения дампов ядра ядра на клиентской машине необходимо изменить boot-args Переменная NVRAM для включения двух параметров.

  • Установите флаг 0x0400 в debug параметр. Кроме того, существует много других полезных флагов для этого параметра, описанных подробно ниже.

  • Установите _panicd_ip параметр IP-адресу сервера дампа ядра ядра. Необходимо использовать адрес IPv4 в десятичном представлении с разделением точками; IPv6 и адреса DNS не поддерживаются.

  • При конфигурировании системы Сервера Mac OS X как клиент дампа ядра необходимо ограничить или выключить watchdogtimerd. В системе Сервера Mac OS X сторожевой таймер перезагружает машину после того, как произойдет паника. Необходимо ограничить или отключить watchdogtimerd в то время как клиент находится в процессе отправки дампа ядра к серверу, так, чтобы система сервера не перезагружала.

    Примечание: В системе Сервера Mac OS X можно выключить watchdogtimerd использование энергетической предпочтительной вкладки области Options Средства сохранения, или из командной строки. Также можно изменить количество времени watchdogtimerd ожидает перед перезагрузкой. Посмотрите watchdogtimerd для получения дополнительной информации о модификации сторожевого поведения.

Перечисление 12 показывает пример того, как установить boot-args микропрограммная переменная, предполагая, что IP-адрес сервера дампа ядра ядра 10.0.40.2.

Перечисление 12: Установка переменной встроенного микропрограммного обеспечения начальной-загрузки-args

client$ sudo nvram boot-args="debug=0xd44 _panicd_ip=10.0.40.2"
Password: ********

Необходимо перезапустить для включения этой установки.

IMPORTANT: boot-args Переменная NVRAM может быть сброшена каждый раз, когда Вы устанавливаете новое системное программное обеспечение, включая обновления программного обеспечения, и каждый раз, когда Вы изменяете загрузочный диск с помощью Установок системы.

Флаги отладки подробно

Можно использовать boot-args отладьте флаги для управления различными аспектами отладки ядра. Многие из этих флагов документируются в существующую документацию. Таблица 1 описывает флаги, наиболее относящиеся к дампам ядра ядра. Таблица 2 показывает, как объединить эти флаги для осуществления различных полезных способов поведения.

Таблица 1: флаги Отладки

Символьное имя Флаг Описание
DB_NMI 0x0004 Активирует средство отладки ядра, включая поддержку NMI (переключатель программиста на передней стороне компьютера; посмотрите Технические Вопросы и ответы QA1264: Генерация Немаскируемого прерывания (NMI), если Ваша машина не имеет переключателя программиста).
DB_ARP 0x0040 Позволяет куску отладчика ядра использовать ARP и таким образом поддерживать отладку через подсети. Вы обычно включали бы этот флаг при сборе дампов ядра ядра.
DB_LOG_PI_SCRN 0x0100 Отключите графический панический экран. Вы обычно хотите сделать это при включении дампов ядра ядра так, чтобы Вы видели прогресс для передачи дампа ядра ядра.
DB_KERN_DUMP_ON_PANIC 0x0400 Когда система паникует, вызывает ядро к дампу ядра.
DB_KERN_DUMP_ON_NMI 0x0800 Когда пользователь инициировал NMI, вызывает ядро к дампу ядра.
DB_DBG_POST_CORE 0x1000 Управляет поведением ядра после дампа ядра в ответ на NMI (DB_KERN_DUMP_ON_NMI). Если пользователь инициирует NMI, и этот флаг ясен, то ядро будет выводить ядро и затем продолжаться. С другой стороны, если этот флаг будет установлен, то ядро будет выводить ядро и затем ожидать соединения отладчика.
DB_PANICLOG_DUMP 0x2000 Средства управления, выводит ли ядро полное ядро (если флаг ясен) или просто панический журнал (если флаг установлен).

Таблица 2: Полезные комбинации флага отладки

Значение Сценарий
0x0044 Используемый для ежедневной отладки с двумя машинами. DB_NMI позволяет Вам вводить отладчик ядра путем инициирования NMI. DB_ARP позволяет Вам отладить без futzing вокруг с постоянными записями таблицы ARP.
0x0444 Используемый для получения дампов ядра ядра. DB_NMI идет для активации отладки ядра. DB_ARP идет, как объяснено выше. DB_KERN_DUMP_ON_PANIC активирует средство дампа ядра ядра.
0x2444 Используемый для получения ядра пугают журналы. Флаги установлены на предыдущую строку за исключением того, что DB_PANICLOG_DUMP установлен, заставив ядро генерировать панические журналы, а не дампы ядра.
0x0844 Полезный, когда пользователь сообщает о таинственных замораживаниях уровня ядра. Когда замораживание происходит, пользователь может инициировать NMI, и система генерирует дамп ядра ядра и затем продолжается. Нет никакой потребности установить DB_LOG_PI_SCRN потому что это не имеет никакого эффекта в этом случае.
0x0d44 Полезный для тестирования средства дампа ядра ядра. Если или паника происходит или пользовательский триггерный NMI, это генерирует дамп ядра ядра. DB_LOG_PI_SCRN установлен так, чтобы Вы видели прогресс для передачи дампа ядра ядра.

Назад к началу.

Тестирование Вашей конфигурации

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

  1. Можно инициировать панику с помощью DTrace в клиентских системах рабочий Mac OS X 10.5 или больше.

  2. Можно инициировать панику с помощью расширения ядра InstantPanic, работающего на все выпуски Mac OS X.

Инициирование паники ядра с DTrace

Для Mac OS X 10.5 или позже, использовать dtrace в Окне терминала как показано в Перечислении 13 для инициирования ядра паникуют в клиентской системе.

Перечисление 13: Используя DTrace для инициирования паники в клиентской системе

client$ sudo dtrace -w -n "BEGIN{ panic();}"

Назад к началу.

Инициирование паники ядра с мгновенным паническим расширением ядра

Для всех версий Mac OS X это техническое примечание включает простое расширение ядра, InstantPanic, пугающий ядро, как только Вы загружаете его. Можно получить источник и двоичный файл для этого расширения ядра от раздела Downloadables.

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

Перечисление 14: Инициирование паники путем загрузки расширения ядра 'InstantPanic'

client$ cd ~/Desktop/InstantPanic/build/
client$ sudo cp -r InstantPanic.kext /
Password: ********
client$ sudo kextload /InstantPanic.kext

Примечание: В Перечислении 14 мы делаем копию расширения ядра как корень (использование sudo) чтобы гарантировать, что это имеет правильные полномочия файла. Вы не можете загрузить расширения ядра неправильными полномочиями файла. Если kextload распечатывает сообщение, говоря, что KEXT не подлинен, можно фиксировать использование полномочий sudo chown -R root:wheel /InstantPanic.kext.

Назад к началу.

Файл дампа ядра паники ядра

Как только паника происходит, если все будет подходить, то клиент передаст дамп ядра ядра к серверу. Вы видите, что передача развивается на экране клиента (предполагающий, что Вы устанавливаете DB_LOG_PI_SCRN отладьте флаг).

Когда передача завершена, можно перечислить /PanicDumps каталог на сервере для наблюдения нового панического файла дампа.

Перечисление 15: дамп ядра ядра в качестве примера

server$ ls -l /PanicDumps
total 216872
-rw-rw---- 1 nobody  wheel  300245144 Sep 19 12:51 paniclog-xnu-1228.5.20-10.0.40.7-3a061187

Имя этого файла включает версию ядра — как выведено на экран uname -a, в этом случае 20.05.1228 - и IP-адрес (10.0.40.7) клиента, вместе с уникальной меткой времени.

Примечание: Для Mac OS X 10.4.6 и ранее, имя файла дампа ядра не включает вспомогательную версию ядра.

Раздел Debugging with Kernel Core Dumps объясняет, как можно отладить панику ядра использование файла дампа ядра. Также, если Вы установили DB_PANICLOG_DUMP флаг, /PanicDumps каталог будет содержать панический файл журнала, во многом как файл, в который Вы вошли бы /Library/Logs после паники. Перечисление 16 показывает пример этого.

Перечисление 16: файл журнала паники в качестве примера

server$ ls -l /PanicDumps
total 216872
-rw-rw---- 1 nobody  wheel       300245144 Sep 19 12:51 paniclog-xnu-1228.5.20-10.0.40.7-3a061187
server$ sudo cat /PanicDumps/paniclog-xnu-1228.5.20-10.0.40.7-3a061187 
panic(cpu 0 caller 0x21058018): InstantPanic: Just add water!
Backtrace, Format - Frame : Return Address (4 potential args on stack) 
0x1b38fc18 : 0x12b0fa (0x4592a4 0x1b38fc4c 0x133243 0x0) 
0x1b38fc68 : 0x21058018 (0x21058053 0x0 0x2a57e38 0x2e4f4a0) 
0x1b38fc88 : 0x18f24d (0x21058080 0x0 0x0 0x0) 
0x1b38fcc8 : 0x18f51e (0x6f 0x1 0x2e4f4a4 0x2e4f4c0) 
0x1b38fd68 : 0x147c60 (0x53b8e0 0x6f 0x1 0x2e4f4a4) 
0x1b38fdb8 : 0x12d17e (0x2e4f488 0x3300790 0x1b38fdf8 0x11ee14) 
0x1b38fdf8 : 0x126257 (0x2e4f400 0x2a50844 0x3338e88 0x0) 
0x1b38ff08 : 0x1973dd (0x1b38ff44 0x0 0x0 0x0) 
0x1b38ffc8 : 0x19f3b3 (0x33cfc34 0x0 0x1a20b5 0x2f73790) 
No mapping exists for frame pointer
Backtrace terminated-invalid frame pointer 0xbffff458
      Kernel loadable modules in backtrace (with dependencies):
         com.apple.dts.kext.InstantPanic(1.0)@0x21057000->0x21058fff

BSD process name corresponding to current thread: kextload

Mac OS version:
9E17

Kernel version:
Darwin Kernel Version 9.4.0: Mon Jun  9 19:30:53 PDT 2008; root:xnu-1228.5.20~1/RELEASE_I386
System model name: iMac4,1 (Mac-F42787C8)

Для получения дополнительной информации о журналах паники ядра, посмотрите Техническое примечание TN2063: Понимание и Отладка Паники Ядра.

Назад к началу.

Отладка с дампами ядра ядра

Если Вы - программист ядра, Вы можете использовать дампы ядра ядра для отладки паники ядра и зависаете. Перед запуском необходимо собрать вместе следующие полезные ресурсы.

  • Набор Отладки Ядра для запаниковавшего ядра. Можно получить Наборы Отладки Ядра от веб-сайта разработчика Apple.

    Остальная часть этого раздела предполагает монтирование корректного образа диска Кернеля Дебуга Кита на машине.

  • Дарвинский исходный код для запаниковавшего ядра. Можно получить Дарвинский исходный код от страницы Darwin Releases на сайте разработчиков Apple. Источник для ядра сдержан xnu проект.

    Дарвинский источник ядра фактически идентичен источнику, используемому для создания ядра Mac OS X. В почти всех случаях можно использовать Дарвинский источник, чтобы сделать значимую отладку на уровне исходного кода ядра Mac OS X.

    Остальная часть этого раздела предполагает, что запаниковавшая машина выполняет Mac OS X 10.5.4, который соответствует xnu-1228.5.20. Кроме того, это предполагает, что Вы загрузили xnu-1228.5.20 источник и что Вы разархивировали его к папке на Вашем названном рабочем столе xnu-1228.5.20.

IMPORTANT: необходимо загрузить ресурсы (Набор Отладки ядра, Дарвин xnu исходный код и другой подходящий исходный код драйвера), которые соответствуют версии ядра на клиентской машине (машина, запаниковавшая).

Первый шаг к отладке с файлом ядра ядра должен открыть тот файл в GDB использование -c опция. Перечисление 17 показывает пример этого. Как только Вы открыли базовый файл в GDB, можно проверить состояние ядра с помощью стандартных команд GDB. Этот пример использование bt вывести на экран след штабеля.

IMPORTANT: Если система, которую Вы используете для анализа дампа ядра паники ядра, использует различную архитектуру машины, чем та из клиентской системы, генерировавшей панику, необходимо включать -arch параметр при использовании GDB. По умолчанию GDB интерпретирует дамп ядра для использования той же архитектуры машины в качестве системы, на которой Вы используете GDB. Если бы клиентская система, генерировавшая панику, была основанной на Intel системой Macintosh, и Вы используете основанную на PowerPC систему Macintosh для анализа дампа ядра, то необходимо включать -arch i386 параметр GDB. С другой стороны, если бы клиентская система, генерировавшая панику, была основанной на PowerPC системой Macintosh, и Вы используете основанную на Intel систему Macintosh для анализа дампа ядра, то необходимо включать -arch ppc параметр GDB.

Перечисление 17: Открытие файла ядра ядра в GDB

server$ sudo gdb -c /PanicDumps/core-xnu-1228.5.20-10.0.40.7-10499ce2 
Password: ********
GNU gdb 6.3.50-20050815 (Apple version gdb-768) (Tue Oct  2 04:07:49 UTC 2007)
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i386-apple-darwin".
#0  0x001ae4cd in ?? ()

Примечание: В Xcode 1.2 и ранее, GDB не позволяет Вам иметь пробелы в пути, который Вы предоставляете к -c параметр. Эта ошибка исправлена в Xcode 1.5 и позже.

Как Вы видите, этот след не содержит символьной информации. Можно фиксировать это путем загрузки символов ядра из Набора Отладки Ядра. Перечисление 18 показывает пример этого. Как только Вы загружаете символы ядра, след теперь намного более полезен.

Перечисление 18: Загрузка символов ядра

(gdb) add-symbol-file /Volumes/KernelDebugKit/mach_kernel
add symbol table from file "/Volumes/KernelDebugKit/mach_kernel"? (y or n) y
Reading symbols from /Volumes/KernelDebugKit/mach_kernel...Reading symbols from /Volumes/KernelDebugKit/mach_kernel.dSYM/Contents/Resources/DWARF/mach_kernel...done.
done.
(gdb) bt
#0  Debugger (message=0x4592a4 "panic") at /SourceCache/xnu/xnu-1228.5.20/osfmk/i386/AT386/model_dep.c:786
#1  0x0012b0fa in panic (str=0x210c7053 "InstantPanic: Just add water!") at /SourceCache/xnu/xnu-1228.5.20/osfmk/kern/debug.c:274
#2  0x210c7018 in ?? ()

Теперь, когда у Вас есть символы, Вы - только короткий шаг далеко от отладки на уровне исходного кода. Поскольку Вы видите от кадра 1 из следа, GDB ожидает находить источник ядра в каталоге /SourceCache/xnu/xnu-1228.5.20. Можно оправдать ту надежду на основании символьной ссылки в хорошем состоянии. Перечисление 19 показывает, как создать эту ссылку.

Перечисление 19: Создание символьной ссылки так, чтобы GDB мог найти источник

server$ mkdir -p /SourceCache/xnu
server$ ln -s ~/Desktop/xnu-1228.5.20 /SourceCache/xnu

Теперь можно оглянуться назад штабель (использующий frame команда), и получают фактические листинги исходного кода (использующий list команда). Перечисление 20 показывает пример этого.

Перечисление 20: отладка на уровне исходного кода

(gdb) frame 0
#0  Debugger (message=0x4592a4 "panic") at /SourceCache/xnu/xnu-1228.5.20/osfmk/i386/AT386/model_dep.c:786
warning: Source file is more recent than executable.
786		hw_atomic_sub(&debug_mode, 1); 
(gdb) frame 1
#1  0x0012b0fa in panic (str=0x210c7053 "InstantPanic: Just add water!") at /SourceCache/xnu/xnu-1228.5.20/osfmk/kern/debug.c:274
warning: Source file is more recent than executable.
274		Debugger("panic");

Наконец, что не менее важно, можно использовать макросы отладки ядра на дампе ядра ядра таким же образом, Вы были бы на живом ядре. Перечисление 21 показывает, как загрузить макросы отладки ядра и выполнить два из самых полезных макросов.

  • paniclog распечатывает стандартную паническую информацию

  • showallstacks распечатывает след для всего, распараллеливают выполнение в ядре

Перечисление 21: макросы отладки Ядра в действии

(gdb) source /Volumes/KernelDebugKit/kgmacros 
Loading Kernel GDB Macros package. Type "help kgm" for more info.
(gdb) paniclog
panic(cpu 0 caller 0x21114018): InstantPanic: Just add water!
Backtrace, Format - Frame : Return Address (4 potential args on stack) 
0x20ed7c18 : 0x12b0fa (0x4592a4 0x20ed7c4c 0x133243 0x0) 
0x20ed7c68 : 0x21114018 (0x21114053 0x0 0x2a57e38 0x538eca0) 
0x20ed7c88 : 0x18f24d (0x21114080 0x0 0x0 0x0) 
0x20ed7cc8 : 0x18f51e (0x72 0x1 0x538eca4 0x538ecc0) 
0x20ed7d68 : 0x147c60 (0x53b8e0 0x72 0x1 0x538eca4) 
0x20ed7db8 : 0x12d17e (0x538ec88 0x5399590 0x20ed7df8 0x11ee14) 
0x20ed7df8 : 0x126257 (0x538ec00 0x2a50508 0x39cf5a0 0x0) 
0x20ed7f08 : 0x1973dd (0x20ed7f44 0x0 0x0 0x0) 
0x20ed7fc8 : 0x19f3b3 (0x40c5e8c 0x19ecd7 0x8 0x40c5e8c) 
No mapping exists for frame pointer
Backtrace terminated-invalid frame pointer 0xbffff458
      Kernel loadable modules in backtrace (with dependencies):
         com.apple.dts.kext.InstantPanic(1.0)@0x21113000->0x21114fff

BSD process name corresponding to current thread: kextload

Mac OS version:
9E17

Kernel version:
Darwin Kernel Version 9.4.0: Mon Jun  9 19:30:53 PDT 2008; root:xnu-1228.5.20~1/RELEASE_I386
System model name: iMac4,1 (Mac-F42787C8)

(gdb) showallstacks
[...]
task        vm_map      ipc_space  #acts   pid  proc        command
0x0345182c  0x039cf5a0  0x02a50508    1    576  0x0333b4a0  kextload
            thread      processor   pri  state  wait_queue  wait_event
            0x05358a78  0x0053b0c0   31  R
        kernel_stack=0x20ed4000
        stacktop=0x20ed7c18
        0x20ed7c18  0x12b0fa <panic+422>
        0x20ed7c68  0x21114018 <com.apple.dts.kext.InstantPanic + 0x1018>
        0x20ed7c88  0x18f24d <kmod_start_or_stop+213>
        0x20ed7cc8  0x18f51e <kmod_control+112>
        0x20ed7d68  0x147c60 <_Xkmod_control+240>
        0x20ed7db8  0x12d17e <ipc_kobject_server+247>
        0x20ed7df8  0x126257 <mach_msg_overwrite_trap+752>
        0x20ed7f08  0x1973dd <mach_call_munger+529>
        0x20ed7fc8  0x19f3b3 <lo_mach_scall+227>
        stackbottom=0x20ed7fc8

Можно узнать больше о макросах отладки ядра в документации Набора I/O.

Примечание: С ядром coredumps, при исследовании потоков кроме потока прервал для записи отладчика, необходимо использовать switchtocorethread и resetcorectx макросы вместо switchtoact и resetctx макросы (которые применяются только для проживания сеансов отладчика ядра).

С GDB под Mac OS X 10.4, если цель corefile была сгенерирована основанной на PowerPC системой Macintosh, необходимо дать следующую команду прежде, чем выйти switchtocorethread команда.

set $lr = 0

Назад к началу.

Опции дампа ядра ядра

Информация выше достаточна для потребностей большинства разработчиков получить дампы ядра паники ядра. Однако существуют опции решить некоторые сетевые проблемы.

  • Если система клиента или сервера имеет существующий сетевой процесс, использующий порт UDP 1069, возможно в некоторых ситуациях изменить назначение портов UDP для системы клиента и сервера. Считайте раздел Configuring the Client and Server Назначение портов UDP для настройки использования назначения портов дампа ядра.

  • Клиентская система может подключенный к локальной сети, где существует больше чем один маршрутизатор, через который клиент может отправить трафик дампа ядра в сервер дампа ядра. может быть полезно в этой топологии сети указать, что клиентская система использует определенный маршрутизатор для отправки пакетов дампа ядра в сервер. Считайте раздел Configuring the Client Router Usage для установки клиента для использования определенного маршрутизатора.

  • По умолчанию клиентская система будет использовать встроенный интерфейс Ethernet en0 для отладки ядра, включая дампы ядра ядра. На некоторых машинах как система Сервера Mac OS X и те настольная система Macintosh, которые имеют два встроенных порта Ethernet, Вы могли бы хотеть, чтобы дамп ядра ядра был отослан интерфейс Ethernet en1. Считайте раздел Specifying the Ethernet Interface для установки клиента для использования определенного встроенного интерфейса Ethernet.

IMPORTANT: Для использования любой из этих опций необходимо изменить встроенное микропрограммное обеспечение boot-args переменная, затем перезапустите систему. Вы хотите знать что boot-args Переменная NVRAM может быть сброшена каждый раз, когда Вы устанавливаете новое системное программное обеспечение, включая обновления программного обеспечения, и каждый раз, когда Вы изменяете загрузочный диск с помощью Установок системы.

Конфигурирование клиента и сервера назначение портов UDP

Протокол дампа ядра использует UDP на порту 1069 по умолчанию. Назначение портов конфигурируемо для всех выпусков Mac OS X на серверной стороне дампа ядра. На клиентской стороне для основанных на Intel систем Macintosh у Вас должен быть Mac OS X 10.4.7 или больше сконфигурировать пользовательское назначение портов. Для основанной на PowerPC системы Macintosh у Вас должен быть Mac OS X 10.5 или больше сконфигурировать пользовательское назначение портов. Если Вы хотите, чтобы сервер дампа ядра собрал дампы ядра от клиентов PowerPC рабочий Mac OS X 10.4 или ранее, или от основанного на Intel клиента рабочий Mac OS X 10.4.6, необходимо оставить набор присвоения порта сервера значению по умолчанию 1 069.

Конфигурирование клиента назначение портов UDP

Для настройки присвоения клиентского порта на 12 345 добавить _panicd_port=12345 как a boot-args параметр. Перечисление 22 показывает пример установки boot-args включать пользовательское _panicd_port установка.

Перечисление 22: Установка клиента загружает-args микропрограммную переменную для включения назначения портов

client$ sudo nvram boot-args="debug=0xd44 _panicd_ip=10.0.40.2 _panicd_port=12345"
Password: ********

Необходимо перезапустить для включения этой установки.

Назад к началу.

Конфигурирование сервера назначение портов UDP

Для Mac OS X 10.5 или больше, для настройки присвоения порта сервера, редактирование /System/Library/LaunchDaemon/com.apple.kdump.plist файл списка свойств launchd. Изменитесь SockServiceName свойство строки от 1 069 до присвоения требуемого порта. Перезапустите систему для изменения для вступления в силу.

IMPORTANT: Гарантируйте что принадлежность файла и полномочия файла /System/Library/LaunchDaemon/com.apple.kdump.plist файл списка свойств launchd сохраняется через процесс редактирования. Если полномочия файла или настройки принадлежности файла являются неправильными, launchd может не быть в состоянии запустить серверный процесс дампа ядра.

Для сервера дампа ядра, работающего под Mac OS X 10.4.x, для изменения назначение портов, обращаются к Перечислению 4 и изменяют SockServiceName свойство строки от 1 069 до присвоения требуемого порта.

Для сервера дампа ядра, работающего под Mac OS X 10.3.x, для изменения назначение портов, обращаются к Перечислению 7 и изменяют port значение от 1 069 до присвоения требуемого порта.

Назад к началу.

Конфигурирование использования маршрутизатора клиента

Существуют некоторые ситуации, где Вы хотите вынудить клиент дампа ядра связаться с сервером дампа ядра с помощью определенного маршрутизатора. Эта опция существует для основанных на Intel клиентских систем с Mac OS X 10.4.7 или большим настоящим, и для основанных на PowerPC клиентов с Mac OS X 10.5 или большим настоящим. Для настройки присвоения адреса маршрутизатора клиента к 10.0.40.1 добавить _router_ip=10.0.40.1 как a boot-args параметр. Перечисление 23 показывает пример установки boot-args включать пользовательское _router_ip установка.

Перечисление 23: Установка клиента загружает-args микропрограммную переменную для включения присвоения адреса маршрутизатора

client$ sudo nvram boot-args="debug=0xd44 _panicd_ip=10.0.40.2 _router_ip=10.0.40.1"
Password: ********

Необходимо перезапустить для включения этой установки.

Назад к началу.

Указание интерфейса Ethernet

Можно вынудить систему использовать определенный порт путем установки kdp_match_name загрузочный аргумент. Например, для установки системы, чтобы всегда использовать «en1» для отладки ядра добавить kdp_match_name=en1 к Вашему boot-args установка. Обратитесь к Перечислению 24 для примера установки встроенного микропрограммного обеспечения kdp_match_name=en1 свойство.

Перечисление 24: Установка переменной встроенного микропрограммного обеспечения начальной-загрузки-args для включения kdp_match_name присвоения

client$ sudo nvram boot-args="debug=0xd44 _panicd_ip=10.0.40.2 kdp_match_name=en1"
Password: ********

Необходимо перезапустить для включения этой установки.

Примечание: Клиент дампа ядра может только быть сконфигурирован для передачи на встроенном зашитом порту Ethernet. Нет никакой поддержки передачи дампов ядра через интерфейс AirPort, ни через сторонние интерфейсы Ethernet. Это - проблема для MacBook Air, не имеющего никакого встроенного зашитого интерфейса Ethernet.

Назад к началу.

Заключение

Средство дампа ядра ядра является полезным средством отладки и для разработчиков расширения ядра и для пользователей с большими или сложными установками Macintosh. Используя это средство, можно получить информацию о панике ядра (и ядро зависает), где не возможно использовать отладчик ядра с двумя машинами.

Назад к началу.

Дополнительные материалы для чтения

Назад к началу.

Downloadables

Назад к началу.

История версии документа

Дата Примечания
12.11.2008 Пересмотренное содержание для Mac OS X 10.5. Добавленный дополнительный раздел конфигураций - назначение портов, использование маршрутизатора и интерфейсное использование. Добавленная ссылка на FireWire SDK.
18.09.2007 Добавленная информация о минимальном Mac OS X поддерживает для Intel Основанные системы Macintosh - 10.4.7. Улучшенные инструкции установки диска сервера так файлы дампа перезаписываемы всеми пользователями.
29.08.2007 Пойманный недостающий элемент в chown команде до публикации.
17.02.2006 Обсужденные полномочия/PanicDumps. Задокументированный switchtocorethread макрос и kdp_match_name загрузочный аргумент. Исправленный некоторые неработающие ссылки.
12.11.2004 Используйте mkdir-p для создания пути SourceCache в одной команде. Упомяните paniclog макрос отладки ядра. Поместите рабочую копию macosxkdump в/tmp. Обратите внимание на то, что изменение загрузочного диска также сбрасывает начальную-загрузку-args. Ссылочные Вопросы и ответы 1264 в записи таблицы, описывающей DB_NMI.
19.08.2004 Объясняет, как собрать и использовать удаленные дампы ядра ядра.