Linux Stacktraces
06 February 2023
Как читать стектрейсы ядра
На днях понадобилось влезть в ядро, чтобы понять, почему железка стала выдавать неправильные значения. В dmesg
я обнаружил, что упали связанные с железкой модули ядра, там же я обнаружил пару стеков вызовов.
Но у стеков ядра есть одна небольшая проблема: там нет номеров строк, есть только имена функций в районе места падения (да и то если повезёт). К счастью, получить полные стеки оказалось достаточно просто:
- Ставим пакеты с отладочными символами (в Ubuntu это пакеты с суффиксом
-dbg
, для ядра они есть в репозитории, для большинства других пакетов надо подключать отдельный). Если ядро кастомное, нужно собрать его с опциейCONFIG_DEBUG_INFO
(для ускорения сборки можно использоватьCONFIG_DEBUG_INFO_REDUCED
, если нужны только стектрейсы). - Теперь можно воспользоваться скриптом
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
Ну и собственно всё, скрипт приведёт логи падений в более удобный для чтения вид, который уже можно анализировать дальше.
К слову, в моей задаче такое декодирование оказалось бесполезным: после обновления ядра падения ядра ушли.