Операционная система ЗОСРВ «Нейтрино» > Руководство разработчика > Основные принципы системной разработки > Программные интерфейсы микроядра > Дампы ядра и их анализ



Дампы ядра и их анализ

Изучение содержимого kernel dump-ов, исследование последних мгновений "жизни" ядра через системную трассу

В этой главе:

Содержимое дампа ядра
Postmortem трассировка ядра

Содержимое дампа ядра

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


Caution: Ограничения и требования к ISR (Interrupt Service Routine) рассматриваются в руководстве разработчика и соответствующей литературе.

Тем не менее, если ядро завершилось аварийно, в отладочную консоль, в качестве последней меры, может быть выдан аварийный дамп ядра вида:

Shutdown[0,0] S/C/F=11/1/11 C/D=f00e53c0/f01142e0 state(f00)= now lock exit specret KPDA Version 21.11 Release 2024/02/26-14:02:47-MSK [0]PID-TID=1-1 P/T FL=00019001/08800000 "proc/boot/procnto-smp-instr-ksz" [0]ASPACE PID=446494 PF=00001000 "tmp/kcrash" [1]PID-TID=1-2 P/T FL=00019001/08000000 "proc/boot/procnto-smp-instr-ksz" [1]ASPACE PID=77837 PF=00400010 "proc/boot/devb-eide" x86 context[effe8308]: 0000: 00000001 efff9f58 effe8010 effe8328 effe0010 f00ad46d 00000000 effe8010 0020: f0098ee1 0000001d 00011046 efff9f30 00000099 instruction[f0098ee1]: cf 53 51 52 e8 66 43 02 00 5a 59 5b 8b 1c ad e0 42 11 f0 29 83 18 03 00 00 8b stack[efff9f30]: 0000: effe8010 00000200 0000000b effe30a0 0000001a f00ad21d 00000000 effed010 0020: 00000000 00000000 8fbcecc0 0000000b effe30a0 00000000 effe8010 f00a8184 0040: 08800000 f0098ee1 98000002 effe30a0 effed010 08800000 08000000 f0098ee1 0060: 00000000 efd70670 08047df0 effe8010 0002040b f0098ee1 00000000 effe8010

Интерпретировать эти сведения нужно следующим образом:

S/C/F=11/1/11
Сигнал, код и fault-код. Чтобы понять что происходит
  1. проанализируйте ${KPDA_TARGET}/usr/include/signal.h для того, чтобы определить сигнал, посланный процессу (в данном случае SIGSEGV),
  2. затем для этого сигнала найдите в ${KPDA_TARGET}/usr/include/sys/siginfo.h детализацию причина сбоя (в данном случае "SEGV_MAPERR 1 // Address not mapped"),
  3. а также определите с помощью ${KPDA_TARGET}/usr/include/sys/fault.h уточнение по сбою: "FLTPAGE 11 /* Recoverable page fault (no associated sig) */"
C/D
Расположение сегментов кода и данных ядра.
state
Состояние ядра:
now
в ядре
lock
в невытесняемой секции
exit
выход из ядра
specret
специальное возвращение управления
произвольное число
уровень вложенности прерываний
[x]PID-TID=y-z
Идентификатор текущих процесса и потока, а также номер процессора (x).
P/T FL
Флаги текущего процесса и потока (см. <sys/neutrino.h> в части _NTO_PF_* и _NTO_TF_*).
[x]ASPACE PID=y
На каком процессоре (x) было активно адресное пространство процесса y. Строка появляется только в том случае, если имеются отличия от параметра PID-TID.
PF
Флаги процесса для ASPACE PID.
context
Контекст потока (набор регистров, см. <[CPU]/context.h>).
instruction
Инструкция, которая привела к падению ядра.
stack
Содержимое стека.

Postmortem трассировка ядра

При определённых условиях в dump ядра может быть включен фрагмент системной трассы, характеризующий последние мгновенья "жизни" ядра. Это весьма полезно при отладке обработчиков прерываний, поскольку некорректно работающий обработчик может привести к падению ядра и, в тоже время, возможности отладки в нем резко ограничены. Для этого необходимо:

  1. Использовать инструментальную версию микроядра
  2. Запустить микроядро с параметром -st, например:

    procnto-smp-instr-ksz -v -st

  3. Для активации трассировки в ядре запустить сервис tracelogger:

    tracelogger -c -r &

При этом содержимое дампа будет дополнено:

Shutdown[0,0] S/C/F=11/1/11 C/D=f00e53c0/f01142e0 state(f00)= now lock exit specret KPDA Version 21.11 Release 2024/02/26-14:02:47-MSK [0]PID-TID=1-1 P/T FL=00019001/08800000 "proc/boot/procnto-smp-instr-ksz" [0]ASPACE PID=446494 PF=00001000 "tmp/kcrash" [1]PID-TID=1-2 P/T FL=00019001/08000000 "proc/boot/procnto-smp-instr-ksz" [1]ASPACE PID=77837 PF=00400010 "proc/boot/devb-eide" Trace ring: VFJBQ0VfSEVBREVSX0JFR0lOOjpUUkFDRV9GSUxFX05BTUU6Om1lbW9yeVRSQUNFX0RBVEU6OjE3 MDg5NDY2NThUUkFDRV9WRVJfTUFKT1I6OjFUUkFDRV9WRVJfTUlOT1I6OjAxVFJBQ0VfTElUVExF ... AAAAAAQMAMDbwt6zAAAAAAAAAAADDABAN8feswEAAAAAAAGAAwwAwDfH3rNA1AnwAAAAAAQMAEDf 4N6zAAABgAAAAAAEDACA3+DeswAAAAAAAAAABAwAwN/g3rMAAAAAAAAAAAIMAACB5N6zAAABgAEA AAA= x86 context[effe8308]: 0000: 00000001 efff9f58 effe8010 effe8328 effe0010 f00ad46d 00000000 effe8010 0020: f0098ee1 0000001d 00011046 efff9f30 00000099 instruction[f0098ee1]: cf 53 51 52 e8 66 43 02 00 5a 59 5b 8b 1c ad e0 42 11 f0 29 83 18 03 00 00 8b stack[efff9f30]: 0000: effe8010 00000200 0000000b effe30a0 0000001a f00ad21d 00000000 effed010 0020: 00000000 00000000 8fbcecc0 0000000b effe30a0 00000000 effe8010 f00a8184 0040: 08800000 f0098ee1 98000002 effe30a0 effed010 08800000 08000000 f0098ee1 0060: 00000000 efd70670 08047df0 effe8010 0002040b f0098ee1 00000000 effe8010

Для анализа трассы содержимое поля Trace ring следует сохранить в текстовый файл и декодировать из base64:

base64 -d crash_trace.txt > crash_trace.kev

Проанализировать postmortem трассу ядра можно, например, с помощью утилиты traceprinter:

$ traceprinter -f crash_trace.kev TRACEPRINTER version 1.02 TRACEPARSER LIBRARY version 1.02 -- HEADER FILE INFORMATION -- TRACE_FILE_NAME:: memory TRACE_DATE:: 1708946658 TRACE_VER_MAJOR:: 1 TRACE_VER_MINOR:: 01 TRACE_LITTLE_ENDIAN:: TRUE TRACE_ENCODING:: 16 byte events TRACE_BOOT_DATE:: 1708946587 TRACE_CYCLES_PER_SEC:: 3494393047 TRACE_CPU_NUM:: 2 TRACE_SYSPAGE_LEN:: 2664 -- KERNEL EVENTS -- t:0x10988395 CPU:00 CONTROL: BUFFER sequence = 281, num_events = 0 t:0x10988395 CPU:00 CONTROL :TIME msb:0x0000003b lsb(offset):0x10988163 t:0x10988395 CPU:00 INT_HANDLER_ENTR:0x80010000 (2147549184) PID:1 IP:0xf009d440 AREA:0x00000000 t:0x109896ae CPU:00 INT_HANDLER_EXIT:0x80010000 (2147549184) SIGEVENT:INTR EVENT ... t:0xb3dee0df CPU:00 INT_HANDLER_EXIT:0x80010000 (2147549184) SIGEVENT:INTR EVENT t:0xb3dee481 CPU:00 INT_EXIT:0x80010000 (2147549184) inkernel:0x00000001




Предыдущий раздел: Программные интерфейсы микроядра