Отладка в Linux с использованием отвалов ядра

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

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

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

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

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

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

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

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

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

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

Ответы

Ответ 1

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

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

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

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

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

Ответ 2

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

Ответ 3

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

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