Отладка в Linux с помощью дампов ядра

Каковы 'лучшие практики' когда дело доходит до отладки дампов ядра с помощью GDB?

В настоящее время я сталкиваюсь с проблемой:

  • Версия выпуска моего приложения компилируется без '-g' флаг компилятора.
  • Отладочная версия моего приложения (скомпилированный с '-g') заархивирована (наряду с исходным кодом и копией двоичного файла выпуска).

Недавно, когда пользователь дал мне дамп ядра, я пытался отладить его использование

gdb --core=./core.pid ./my_app_debug-bin

Ядро было создано my_app_release-bin. Кажется, существует некоторое несоответствие между базовым файлом и двоичным файлом.

С другой стороны, если я пробую

gdb --core=./core.pid ./my_app_release-bin

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

Это то, что осуществлено? Поскольку я чувствую, что пропускаю что-то здесь.

14
задан Peter Mortensen 15 February 2010 в 10:11
поделиться

3 ответа

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

Вот что мы делаем на моем рабочем месте.

  1. Включите флаг -g при сборке окончательной версии.
  2. Заархивируйте эту версию.
  3. запустите strip --strip-undeeded для двоичного файла перед его отправкой клиентам.

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

Следует отметить, что если ваша версия выпуска включает оптимизацию, отладка может быть затруднена даже с использованием символов. Например, оптимизатор может переупорядочить ваш код, так что даже если отладчик скажет, что вы разбились на строке N, вы не можете предположить, что код действительно выполнил строку N-1.

16
ответ дан 1 December 2019 в 12:38
поделиться

Нет, вы ничего не пропустите. debug и release - это просто разные двоичные файлы, поэтому основные файлы выпуска не соответствуют двоичному файлу отладки. Вы должны взглянуть на машинный код, чтобы получить что-то из дампа ядра релиза.

Вероятно, вам придется спросить своего пользователя, как произошел сбой, и собрать дополнительную информацию журнала или все, что создает ваше приложение.

1
ответ дан 1 December 2019 в 12:38
поделиться

Вам нужно сделать некоторые дополнительные вещи для создания двоичных файлов с удаленной отладочной информацией, которую затем можно отладка с ядер. Лучшее описание, которое я смог найти, это здесь

5
ответ дан 1 December 2019 в 12:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: