Страницы

Поиск по вопросам

среда, 5 февраля 2020 г.

Кто вызвал abort()?

#cpp #linux


На целевой системе программа вылетает при некоторых входных данных с exit кодом 134
(SIGABORT). Возможности запустить под отладчиком нет.

Каким образом (кроме пристального изучения кода) найти место (функцию, в идеале callstack),
где сработал вызов abort()?

В исходниках прямого вызова abort() нет. Вывод backtrace_symbols_fd в обработчике
сигнала показывает цепочку вызовов начиная с abort() (внутри стандартной библиотеки),
кончая обработчиком сигнала (вызовы, предшествующие abort() отсутствуют).
    


Ответы

Ответ 1



Методом деления отрезка пополам. Вполне серьёзно. Занимаюсь разработкой реал-тайм систем, в которых никакие отладчики использовать невозможно. Поэтому, когда возникает такая ситуация, поступаю следующим образом: Пытаюсь понять хотя бы, в какой функции происходит прерывание. Делю текст функции на 10 (ориентировочно) частей с помощью операторов вида printf("01\n"); - printf("10\n"); Запускаю программу, получаю локализацию в первом приближении. Полученный отрезок делю опять, пока не дохожу до интервала в одну строку исходного текста. Обычно на это хватает 2-3 итерации.

Комментариев нет:

Отправить комментарий