Linux Stacktraces

06 February 2023

Как читать стектрейсы ядра

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

Но у стеков ядра есть одна небольшая проблема: там нет номеров строк, есть только имена функций в районе места падения (да и то если повезёт). К счастью, получить полные стеки оказалось достаточно просто:

  1. Ставим пакеты с отладочными символами (в Ubuntu это пакеты с суффиксом -dbg, для ядра они есть в репозитории, для большинства других пакетов надо подключать отдельный). Если ядро кастомное, нужно собрать его с опцией CONFIG_DEBUG_INFO (для ускорения сборки можно использовать CONFIG_DEBUG_INFO_REDUCED, если нужны только стектрейсы).
  2. Теперь можно воспользоваться скриптом decode_stacktrace.sh из исходников ядра, чтобы декодировать файл со стектрейсом, например, так (точные пути могут отличаться):
    $ dmesg | ./decode_stacktrace.sh /usr/lib/debug/lib/modules/`uname -r`/vmlinux /usr/lib/debug/lib/modules/4.1.12-112.14.14.el7uek.x86_64/ > out
    

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

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