Каковы 'лучшие практики' когда дело доходит до отладки дампов ядра с помощью GDB?
В настоящее время я сталкиваюсь с проблемой:
Недавно, когда пользователь дал мне дамп ядра, я пытался отладить его использование
gdb --core=./core.pid ./my_app_debug-bin
Ядро было создано my_app_release-bin
. Кажется, существует некоторое несоответствие между базовым файлом и двоичным файлом.
С другой стороны, если я пробую
gdb --core=./core.pid ./my_app_release-bin
базовые соответствия, но я неспособен получить числа строки исходного кода (хотя я получаю имена функций).
Это то, что осуществлено? Поскольку я чувствую, что пропускаю что-то здесь.
Похоже, есть другие различия между вашим выпуском и отладочной сборкой, а не просто отсутствие / наличие флага -g
. Предполагая, что это так, вы ничего не можете сделать прямо сейчас, но вы можете настроить свою сборку, чтобы лучше справиться с этим:
Вот что мы делаем на моем рабочем месте.
-g
при сборке окончательной версии. strip --strip-undeeded
для двоичного файла перед его отправкой клиентам. Теперь, когда мы получаем сбой, мы можем использовать заархивированную версию с символами для отладки.
Следует отметить, что если ваша версия выпуска включает оптимизацию, отладка может быть затруднена даже с использованием символов. Например, оптимизатор может переупорядочить ваш код, так что даже если отладчик скажет, что вы разбились на строке N, вы не можете предположить, что код действительно выполнил строку N-1.
Нет, вы ничего не пропустите. debug и release - это просто разные двоичные файлы, поэтому основные файлы выпуска не соответствуют двоичному файлу отладки. Вы должны взглянуть на машинный код, чтобы получить что-то из дампа ядра релиза.
Вероятно, вам придется спросить своего пользователя, как произошел сбой, и собрать дополнительную информацию журнала или все, что создает ваше приложение.
Вам нужно сделать некоторые дополнительные вещи для создания двоичных файлов с удаленной отладочной информацией, которую затем можно отладка с ядер. Лучшее описание, которое я смог найти, это здесь