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

231
30 ноября 2017, 02:31

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

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

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

Answer 1

Методом деления отрезка пополам. Вполне серьёзно. Занимаюсь разработкой реал-тайм систем, в которых никакие отладчики использовать невозможно. Поэтому, когда возникает такая ситуация, поступаю следующим образом:

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

Посыл системе сообщений с помощью MMDevice

Хотелось бы узнать, отправляет ли данное API сообщения в winapi процедуру? Что пытаюсь сделать: в бесконечном цикле(ну, вы понимаете) идет постоянное...

251
Как вывести кодовый сегмент программы?

Как вывести кодовый сегмент программы?

программа должна выводить на экран содержимое своего кодового сегментаКонсольная программа

199
Digest авторизация в gSOAP

Digest авторизация в gSOAP

Не могу запустить тест httpdatest, который поставляется с gSOAP, точнее тест запускается, но не отрабатывает корректноПо задумке, клиент обращается...

215
Проверка массива на упорядоченность

Проверка массива на упорядоченность

Не правильно работает проверка массива на упорядоченность по возрастанию, где ошибка?

274