Отладка в 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 - это просто разные бинарные файлы, поэтому основные файлы выпуска не соответствуют двоичному отладку. Вы должны посмотреть машинный код, чтобы получить что-то из дампа ядра релиза.
Вероятно, вам нужно спросить у пользователя, как произошел сбой, и собрать дополнительную информацию журнала или все, что вы создаете.