Обратите внимание, что abort
повышает сигнал SIGABRT
, как если бы он вызывал raise(SIGABRT)
. Вы можете установить обработчик сигнала, который вызывается в этой ситуации, например:
#include <signal.h>
extern "C" void my_function_to_handle_aborts(int signal_number)
{
/*Your code goes here. You can output debugging info.
If you return from this function, and it was called
because abort() was called, your program will exit or crash anyway
(with a dialog box on Windows).
*/
}
/*Do this early in your program's initialization */
signal(SIGABRT, &my_function_to_handle_aborts);
Если вы не можете предотвратить вызовы abort
(скажем, они вызваны ошибками, которые появляются, несмотря на ваши лучшие намерения), это может позволить вам собрать дополнительную информацию для отладки. Это портативный ANSI C, поэтому он работает на Unix и Windows, а также на других платформах, хотя то, что вы делаете в обработчике прерывания, часто не будет переносимым. Обратите внимание, что этот обработчик также вызывается при сбое assert
или даже другими функциями времени выполнения, например, если malloc
обнаруживает повреждение кучи. Так что ваша программа может быть в сумасшедшем состоянии во время этого обработчика. Вы не должны выделять память - используйте статические буферы, если это возможно. Просто сделайте минимум, чтобы собрать необходимую информацию, получить сообщение об ошибке для пользователя и выйти.
Некоторые платформы могут разрешать дальнейшую настройку их функций abort
. Например, в Windows Visual C ++ имеет функцию _set_abort_behavior
, которая позволяет выбрать, будет ли отображаться сообщение для пользователя и будут ли собираться аварийные дампы.