Как запретить Windows отображать диалог с сообщением «Ошибка отладки! Abort () был вызван»? - PullRequest
0 голосов
/ 23 мая 2019

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

Таким образом, мои тесты порождают дочерний процесскоторый получает ресурс и звонит std::abort.Кажется, все это работает нормально, и тесты проходят на Linux и macOS.Однако в Windows появляется следующее диалоговое окно:

Error Dialog

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

#include "Windows.h"
#include "errhandlingapi.h"
#include <cstdlib>

int main()
{
  SetErrorMode(SEM_FAILCRITICALERRORS |
               SEM_NOGPFAULTERRORBOX |
               SEM_NOALIGNMENTFAULTEXCEPT);
  std::abort();
}

1 Ответ

1 голос
/ 23 мая 2019

Вы можете вызвать _set_abort_behavior с параметрами _set_abort_behavior(0, _WRITE_ABORT_MESSAGE | _CALL_REPORTFAULT) при запуске программы, чтобы подавить оба сообщения «abort () был вызван» (которое при отладке включает в себя кнопки отладки / повтора / игнорирования)) и генерация аварийного дампа Уотсона.Первый параметр очищает оба флага, а второй - маску, для которой устанавливаются биты флага.

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