Как читать, понимать, анализировать и отлаживать панику ядра Linux?

рассмотрим следующую трассировку стека дампа ядра linux, вы можете вызвать панику из исходного кода ядра, вызвав panic("debugging a linux kernel panic");:

[<001360ac>] (unwind_backtrace+0x0/0xf8) from [<00147b7c>] (warn_slowpath_common+0x50/0x60)
[<00147b7c>] (warn_slowpath_common+0x50/0x60) from [<00147c40>] (warn_slowpath_null+0x1c/0x24)
[<00147c40>] (warn_slowpath_null+0x1c/0x24) from [<0014de44>] (local_bh_enable_ip+0xa0/0xac)
[<0014de44>] (local_bh_enable_ip+0xa0/0xac) from [<0019594c>] (bdi_register+0xec/0x150)
  • на unwind_backtrace+0x0/0xf8 какого +0x0/0xf8 расшифровывается?
  • как я могу видеть код c unwind_backtrace+0x0/0xf8?
  • как интерпретировать содержание паники?

3 ответов


это просто обычный backtrace, эти функции вызываются в обратном порядке (первый вызванный был вызван предыдущим и так далее):

unwind_backtrace+0x0/0xf8
warn_slowpath_common+0x50/0x60
warn_slowpath_null+0x1c/0x24
ocal_bh_enable_ip+0xa0/0xac
bdi_register+0xec/0x150

на bdi_register+0xec/0x150 является символом + смещение / длина есть дополнительная информация об этом в понимание ядра ой и как вы можете устранить ошибки ядра. Также есть этот отличный учебник по отладка ядра

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

addr2line -e vmlinux_with_debug_info 0019594c(+offset)


вот 2 Альтернативы для addr2line. Предполагая, что у вас есть цепочка инструментов правильной цели, вы можете сделать одно из следующих действий:

использовать objdump:

  1. найти vmlinux или .ko файл в корневом каталоге ядра, затем разберите объектный файл:

    objdump -dS vmlinux > /tmp/kernel.s
    
  2. откройте сгенерированный файл сборки,/tmp/kernel.s. с помощью текстового редактора, такого как vim. Идти к unwind_backtrace+0x0/0xf8, т. е. поиск адрес unwind_backtrace + С offset. Наконец, вы обнаружили проблемную часть в исходном коде.

использовать gdb:

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

  1. выполнить gdb <path-to-vmlinux>.
  2. выполнить в приглашении gdb:list *(unwind_backtrace+0x10).

для получения дополнительной информации вы можете оформить заказ следующее:

  1. Отладка Ядра Трюки.
  2. Отладка Ядра Linux С Помощью Gdb

на unwind_backtrace+0x0/0xf8 какого +0x0/0xf8 расшифровывается?

первый номер (+0x0) является смещение от начала функции (unwind_backtrace в данном случае). Второе число (0xf8) является общая длина функция. Учитывая эти две части информации, если у вас уже есть догадка о том, где произошла ошибка, это может быть достаточно, чтобы подтвердить ваши подозрения (вы можете сказать (примерно) сколько в функции вы бывший.)

чтобы получить точную исходную строку соответствующей инструкции (как правило, лучше, чем догадки), используйте addr2line или другие методы в других ответах.