Задать вопрос
@kuzko

Как в Release конфигурации в Linux узнать конкретное место падения программы?

Подскажите, можно ли как-то на Linux по release конфигурации и core файлу узнать место, где в программе произошла ошибка (конкретно, номер ассемблерной инструкции, которая привела к ошибке)?

При использовании gdb не понятно в каком конкретно месте упала программа:

Program terminated with signal SIGSEGV, Segmentation fault.
#0 0x00005633bd506050 in ?? ()
  • Вопрос задан
  • 175 просмотров
Подписаться 2 Простой Комментировать
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
При использовании gdb не понятно в каком конкретно месте упала программа:
#0 0x00005633bd506050 in ?? ()


Так вот же адрес: 0x00005633bd506050

Как в Release конфигурации

Не нужно убирать опцию -g из релизной сборки. После сборки можно скопировать получившийся ELF, отрезать от него отладочные символы и запускать его. Когда что-то упадёт, можно будет загрузить core dump с ELFом, в котором отладочные символы присутствуют, чтобы не гадать, где этот адрес.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
CityCat4
@CityCat4
//COPY01 EXEC PGM=IEBGENER
А что Вам даст конкретная асмовая инструкция? Нарушение защиты памяти, программа обратилась по адресу, который ей не принадлежит. Выполнялась скорее всего функция из libc. Если отладочной версии нет, можно попробовать strace/dtrace и предположить, где падает.
Ответ написан
Комментировать
@ashumkin
системный разработчик
Номер/адрес ассемблерной инструкции, как уже заметили, тебе и показывается.
Но, чтобы получить номер строки в исходном коде, нужна отладочная информация.
Как, опять же, заметили, можно загрузить дамп релизной сборки с отладочным бинарём. Возникает вопрос "где его взять?" Потенциально, если одни и те же исходники собирать одним и тем же компилятором с одними и теми же настройками в том же окружении, что и релизный (что позволяет делать сервер сборок, например...), но с включённой отладочной инфой, то с точки зрения логики, бинарь должен получиться идентичный в части адресов инструкций. Его-то и можно использовать.
Я так делал для Windows-приложений. Но не думаю, что разница ОС что-либо решает...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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