Программный захват события закрытия окон при нехватке ресурсов GDI

Я пытаюсь поймать все неожиданные завершения в моем процессе.

Я использовал эти функции, чтобы поймать все необработанные ошибки и исключения, которые я могу придумать, но этого недостаточно:

    SetUnhandledExceptionFilter(OnUnhandledNativeException);

    set_terminate(set_terminateHandler);

    set_unexpected(set_unexpectedHandler);

    _set_purecall_handler(set_purecallHandler);

    _set_new_handler(HandleProgramMemoryDepletion);       

    _set_invalid_parameter_handler(InvalidParameterHandler);

    signal(SIGABRT, sigabrt_handler); 
    signal(SIGINT, sigabrt_handler);
    signal(SIGTERM , sigabrt_handler);

Эти функции ловят практически любую ошибку в приложении.

Но когда приложение завершается из-за сбоя GDI (например, у GDI не хватает ресурсов), ни одна из этих функций не вызывается.

Кто-нибудь знает, как я могу перехватывать события ошибок GDI?
Я уверен, что должен быть какой-то способ перегрузить его и изменить функцию обратного вызова.

И знает ли кто-нибудь о каких-либо других странных сценариях, когда этих функций просто недостаточно?

Примечание.

Точной ошибкой, которую он не перехватывает, является "Необходимый ресурс был недоступен".
Это вызвано тем, что вы создаете много объектов GDI и не выпускаете их.
Программа аварийно завершает работу, потому что их недостаточно ресурсов задолго до того, как закончится память.


person Yochai Timmer    schedule 09.10.2011    source источник
comment
Может стоит исправить утечку ресурсов?   -  person Ferruccio    schedule 09.10.2011
comment
Нужно сделать компонент, чтобы найти проблему, прежде чем вы сможете ее исправить.   -  person Yochai Timmer    schedule 09.10.2011


Ответы (3)


  1. Некоторые из перечисленных вами функций (например, SetUnhandledExceptionFilter) устанавливают обработчики для текущего потока. Поэтому вы должны вызывать их в каждом потоке.
  2. В список можно добавить векторную обработку исключений (AddVectoredExceptionHandler).
person Yakov Galka    schedule 09.10.2011

Если вы используете Visual C++, __try __finally обычно помогает. Обратите внимание, что это не портативное решение.

person SmacL    schedule 09.10.2011
comment
Я пытаюсь заменить обратные вызовы, чтобы использовать внешнюю DLL для отслеживания сбоев приложения. Это для того, чтобы покрыть ситуацию, когда программист забыл попробовать/поймать свой метод. - person Yochai Timmer; 09.10.2011

Хорошо, решил проблему.

Это БЫЛО ловить аварию.

Проблема заключалась в том, что в процессе восстановления данных после сбоя открывалась форма, которая должна была уведомить пользователя о возникновении ошибки.

Конечно, у нас закончились объекты GDI, поэтому Форма не может быть отрисована, так что сам по себе выброс и исключение, у нас было еще одно необработанное исключение, и процесс действительно завис.

person Yochai Timmer    schedule 09.10.2011