Не могли бы вы рассказать мне, что может вызвать ошибку SIGABRT на С++?
Что вызывает ошибку SIGABRT?
Ответ 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