Отладка в Linux с использованием дампов ядра - PullRequest
14 голосов
/ 15 февраля 2010

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

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

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

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

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

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

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

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

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

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

Ответы [ 3 ]

16 голосов
/ 15 февраля 2010

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

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

  1. Включите флаг -g при создании версии выпуска.
  2. Архив этой версии.
  3. запустите strip --strip-unneeded в двоичном файле перед отправкой его клиентам.

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

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

5 голосов
/ 15 февраля 2010

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

1 голос
/ 15 февраля 2010

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

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

...