У меня есть процесс, который отлично обрабатывает исключения. Он вызывает:
_set_se_translator(exception_trans_func);
SetUnhandledExceptionFilter(UnhandledExceptionFilterHandler);
_set_purecall_handler(purecallHandler);
set_terminate(terminateHandler);
set_unexpected(unexpectedHandler);
_set_invalid_parameter_handler(InvalidParameterHandler);
atexit(exitHandler); //ignored during an expected exit
_onexit(onexitHandler); //ignored during an expected exit
Каждый раз, когда происходит исключение, вызывается один из обработчиков, который создает аварийный дамп для меня. Жизнь хороша.
За исключением одного сайта заказчика. Когда они завершают процесс, возникает исключение, которое по какой-то причине не проходит через эти вызовы, и они получают ошибку:
Инструкция по адресу «0x101ba9df» ссылалась на память по адресу «0x00000004». Память не могла быть "прочитана". Нажмите OK, чтобы завершить....
Ссылка на память x000000004 выглядит так, как будто это нулевой указатель. И глядя на этот адрес, выглядит как деструктор глобального объекта STL (вероятно, в вызове initterm CRT, где очищаются глобальные переменные).
Сейчас я немного застрял, так как не могу получить диагностический дамп и стек вызовов и точно увидеть, что происходит. Так....
Почему исключение не направляется через указанные выше обработчики, а вместо этого отображается пользователю?
Есть ли способ скрыть этот диалог (поскольку в этот момент не причиняется никакого вреда)?
И есть ли способ отследить корневую ошибку?
Спасибо за любые идеи.