Моя программа работает так:
exe -p param1 -i param2 -o param3
Сбой и генерирование файла дампа ядра core.pid
.
Я хочу проанализировать файл дампа
gdb ./exe -p param1 -i param2 -o param3 core.pid
Но GDB распознает параметры файла EXE как входные данные GDB.
Как мне проанализировать файл дампа ядра в этой ситуации?
exe
это не сценарий оболочки (для установки некоторых переменных и т. Д.), Как, напримерfirefox
, в Linux?Ответы:
Вы можете использовать ядро с GDB разными способами, но передача параметров, которые должны быть переданы в исполняемый файл, в GDB не является способом использования файла ядра. Это также может быть причиной того, что вы получили эту ошибку. Вы можете использовать файл ядра следующими способами:
gdb <executable> <core-file>
илиgdb <executable> -c <core-file>
илиПри использовании файла ядра вам не нужно передавать аргументы. Сценарий сбоя показан в GDB (проверено с версией 7.1 GDB в Ubuntu).
Например:
Если вы хотите передать параметры в исполняемый файл для отладки в GDB, используйте
--args
.Например:
Справочные страницы будут полезны для просмотра других вариантов GDB.
источник
Простое использование GDB для отладки файлов coredump:
Файл coredump для «процесса» создается как файл «core.pid».
После того, как вы попадете внутрь приглашения GDB (при выполнении вышеупомянутой команды), введите:
Это даст вам информацию из стека, где вы сможете проанализировать причину сбоя / сбоя. Другая команда, для тех же целей:
Это то же самое, что и выше. По соглашению, он перечисляет всю информацию стека (что в конечном итоге приводит к месту сбоя).
источник
Просто пропустите параметры. GDB не нуждается в них:
источник
objdump
+gdb
минимальный работоспособный примерTL; DR:
objdump -s core
может быть использован для дампа памяти наваломТеперь для полной настройки образовательного теста:
main.c
Скомпилируйте и запустите для генерации ядра:
Вывод:
GDB указывает нам на точную линию, где произошла ошибка сегментации, что большинство пользователей хотят при отладке:
затем:
который указывает нам прямо на глючную линию 7.
Аргументы CLI хранятся в основном файле и не требуют повторной передачи.
Чтобы ответить на конкретные вопросы об аргументах CLI, мы увидим, что если мы изменим аргументы cli, например, с помощью:
тогда это отражается на предыдущем bactrace без каких-либо изменений в наших командах:
Итак, обратите внимание, как сейчас
argc=3
. Следовательно, это должно означать, что основной файл хранит эту информацию. Я предполагаю, что он просто хранит его в качестве аргументовmain
, так же, как он хранит аргументы любых других функций.Это имеет смысл, если учесть, что дамп ядра должен хранить всю память и регистрировать состояние программы, и поэтому он имеет всю информацию, необходимую для определения значения аргументов функции в текущем стеке.
Менее очевидным является то, как проверять переменные среды: как получить переменную среды из дампа памяти. Переменные среды также присутствуют в памяти, поэтому objdump действительно содержит эту информацию, но я не уверен, как удобно перечислить их все за один раз. Один за другим поработали над моими тестами:
Анализ Binutils
Используя инструменты binutils, такие как
readelf
иobjdump
, мы можем объединить информацию, содержащуюся вcore
файле, такую как состояние памяти.Большая часть / все это также должно быть видно через GDB, но эти инструменты binutils предлагают более объемный подход, который удобен для определенных случаев использования, в то время как GDB более удобен для более интерактивного исследования.
Первый:
говорит нам, что
core
файл на самом деле является файлом ELF :именно поэтому мы можем проверить это непосредственно с помощью обычных инструментов binutils.
Беглый взгляд на стандарт ELF показывает, что на самом деле ему выделен тип ELF:
Дополнительную информацию о формате можно найти по адресу:
Затем:
дает некоторые советы о структуре файла. Кажется, что память содержится в обычных заголовках программы:
и есть еще несколько метаданных, присутствующих в области заметок, в частности,
prstatus
содержит ПК :objdump
может легко сбросить всю память с помощью:который содержит:
который точно соответствует значению stdout в нашем прогоне.
Это было протестировано на Ubuntu 16.04 amd64, GCC 6.4.0 и binutils 2.26.1.
источник
Из учебника по отладчику RD GDB :
Убедитесь, что ваш файл действительно является
core
изображением - проверьте его с помощьюfile
.источник
Несколько иной подход позволит вам полностью пропустить GDB. Если все , что вы хотите это трассировка, то Linux-специфические утилиты «catchsegv» будут ловить SIGSEGV и отображать трассировку.
источник
Неважно, имеет ли исполняемый файл аргументы или нет. Чтобы запустить GDB для любого двоичного файла с сгенерированным файлом ядра, синтаксис приведен ниже.
Позвольте мне взять приведенный ниже пример для большего понимания.
Из приведенного выше вывода вы можете догадаться о ядре, будь то NULL-доступ, SIGABORT и т. Д.
Эти числа от # 0 до # 10 являются кадрами стека GDB. Эти кадры стека не из вашего двоичного файла. В вышеупомянутых 0 - 10 кадрах, если вы подозреваете, что что-то не так, выберите этот кадр
Теперь, чтобы увидеть более подробную информацию об этом:
Для дальнейшего изучения проблемы вы можете напечатать предполагаемые значения переменных здесь в данный момент времени.
источник
Просто введите команду:
Или
Нет необходимости указывать аргумент командной строки. Дамп кода генерируется из-за более раннего упражнения.
источник
Вы можете проанализировать файл дампа основной памяти, используя команду "gdb".
источник