Если происходит сбой приложения (например, segfault или необработанное исключение), так как некоторые обновления Win10 теперь, кажется, молча умирают - PullRequest
0 голосов
/ 13 ноября 2018

В старое доброе время неправильный доступ к памяти или необработанное исключение в приложении приводили к отображению окна сообщения в некоторой форме.

Мне кажется, что в последнее время это перестало быть правдой.Я могу создать небольшое приложение, которое не делает ничего, кроме записи в NULL-указатель, запускает его из оболочки Windows, и оно просто тихо умирает.

У меня установлены инструменты командной строки Visual C ++, и я использую их для компиляции этого небольшого приложения (обычныйC ++ и win32 SDK).Приложение скомпилировано в 64-битном режиме.

Есть подсказки, что происходит?Я действительно скучаю по тем сообщениям о сбоях ...

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

Если вы хотите, чтобы ваш процесс всегда отображал интерфейс ошибки, вы можете вызвать WerSetFlags со значением WER_FAULT_REPORTING_ALWAYS_SHOW_UI. Или используйте любую другую применимую опцию, предлагаемую Windows Error Reporting , которая соответствует вашим потребностям (например, автоматическое создание аварийного дампа для необработанных исключений).

0 голосов
/ 13 ноября 2018

Это правда, по умолчанию эти окна сообщений отключены.С этим можно сделать несколько вещей:

1.(Re) Включите окно сообщения (наиболее вероятно, что вы ищете)

Нажмите Старт и введите gpedit.msc .Затем перейдите к Конфигурация компьютера -> Административные шаблоны -> Компоненты Windows -> Отчеты об ошибках Windows -> Запретить отображение пользовательского интерфейса для критических ошибок и выберите Отключено .Disable the Prevention В случае сбоя приложения будет возвращено хотя бы несколько сообщений об ошибках.

2.Установите фильтр необработанных исключений (возможно, опасный)

Установите фильтр обработчика исключений и выберите нужные исключения.Недостатком здесь является то, что фильтр вызывается при каждом выдаваемом исключении.

3.Настройте обработчик сигналов (также опасный)

В основном как this .

void SignalHandler(int signal)
{
    printf("Signal %d",signal);
    throw "!Access Violation!";
}

int main()
{
    typedef void (*SignalHandlerPointer)(int);

    SignalHandlerPointer previousHandler;
    previousHandler = signal(SIGSEGV , SignalHandler);
}

4.Используйте отчеты об ошибках Windows

Как упомянуто IInspectable и описано в его ответе .


Варианты 2 и 3 могут стать довольно сложными и опасными.Вам нужно некоторое базовое понимание исключений SEH , поскольку разные опции могут привести к разному поведению.Кроме того, не все разрешено в обработчиках исключений, например: запись в файлы чрезвычайно опасна или даже печать в терминал.Кроме того, поскольку вы обрабатываете эти исключения, ваша программа не будет завершена, то есть после обработчика она вернется к ошибочному коду.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...