Что вызывает ошибку SIGABRT? - программирование
Подтвердить что ты не робот

Что вызывает ошибку SIGABRT?

Не могли бы вы рассказать мне, что может вызвать ошибку SIGABRT на С++?

4b9b3361

Ответ 1

Per Wikipedia,

SIGABRT отправляется процессом самому себе, когда он вызывает функцию abort libc, определенную в stdlib.h. Сигнал SIGABRT можно поймать, но он не может быть заблокирован; если обработчик сигнала возвращается, то все открытые потоки закрываются и очищаются, и программа завершается (при необходимости, сбрасывая ядро). Это означает, что вызов abort никогда не возвращается. Из-за этой характеристики он часто используется для сигнализации фатальных условий в библиотеках поддержки, в ситуациях, когда текущая операция не может быть завершена, но основная программа может выполнять очистку перед выходом. Он используется, когда утверждение терпит неудачу.

Это означает, что если ваш код не вызывает abort напрямую и не отправляет сам сигнал SIGABRT через raise, и у вас нет никаких утверждений об отказе, причина должна заключаться в том, что библиотека поддержки (которая может libc) обнаружил внутреннюю ошибку. Если вы сообщите подробности своей программы, мы сможем предложить возможные причины. Еще лучше, если вы изучите ядро ​​или запустите свою программу в отладчике, вы сможете собрать трассировку стека, которая покажет, какая библиотека заставила вашу программу прерваться.

(Возможно также, что другая программа в вашей системе отправляет вашу программу SIGABRT, но это в большинстве случаев исчезающе маловероятно.)

Ответ 2

Обычно это происходит, когда библиотеки сталкиваются с внутренней ошибкой, поэтому они вызывают abort(), потому что они не могут продолжить. Это может произойти, если вы перезаписываете одну из своих структур данных (например, принадлежащую функции из libc). Таким образом, это может быть, например, libc, потому что вы что-то перезаписали. И приложение должно завершиться, потому что невозможно продолжить или обработать его, что называется неудачным утверждением.

Ответ 3

На практике это обычно запускается макросом assert:

char* foo = NULL;
assert( foo != NULL );

приведет к SIGABRT