Обратите внимание, что abort
вызывает сигнал SIGABRT
, как если бы он назывался raise(SIGABRT)
. Вы можете установить обработчик сигнала, который вызывается в этой ситуации, например:
#include
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
, которая позволяет вам выбрать, будет ли отображаться сообщение пользователю, и собираются ли аварийные свалки.