отмена отмены c ++ - PullRequest
       33

отмена отмены c ++

5 голосов
/ 12 октября 2010

Некоторые библиотеки C ++ вызывают функцию abort () в случае ошибки (например, SDL). В этом случае полезной информации отладки не предоставляется. Не удается отловить прерывание вызова и записать некоторые данные журнала диагностики. Я хотел бы переопределить это поведение глобально, не переписывая / перестраивая эти библиотеки. Я хотел бы бросить исключение и справиться с этим. Возможно ли это?

Ответы [ 3 ]

17 голосов
/ 12 октября 2010

Обратите внимание, что 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, которая позволяет выбрать, будет ли отображаться сообщение для пользователя и будут ли собираться аварийные дампы.

3 голосов
/ 12 октября 2010

Согласно man-странице в Linux, abort () генерирует SIGABRT для процесса, который может быть перехвачен обработчиком сигнала. РЕДАКТИРОВАТЬ: Бен подтвердил, что это возможно и для Windows - см. Его комментарий ниже.

0 голосов
/ 12 октября 2010

Вы можете попробовать написать свой собственный и заставить компоновщик вызывать ваш вместо std :: abort. Однако я не уверен, возможно ли это.

...