Захват исключений OpenMP с помощью SetUnhandledExceptionFilter - PullRequest
0 голосов
/ 12 апреля 2011

У меня обработчик исключений, настроенный с использованием SetUnhandledExceptionFilter, который работает нормально.Однако, если я выбрасываю исключение из кода OpenMP, я получаю стандартное окно «сбой приложения», и обработчик не вызывается, однако я могу просто присоединить отладчик и увидеть, что стек вызовов заканчивается на _CxxThrowException ипродолжается в KernelBase.dll! RaiseException.Я знаю, что программа OpenMP, которая генерирует исключения внутри параллельных областей, неправильна, но я все равно хотел бы получить аварийный дамп.Как я могу получить вызов обработчика исключений в этом случае?

Это должно быть возможно, особенно если отладчику удается получить окно «Необработанное исключение» при подключении к приложению после сбоя (т.е. я могу получитьхорошая трассировка стека и прочее.) Это на Windows 7 с VC ++ 2010.

(В конце концов, каждый поток фактически вызывает мой обработчик исключений. Если происходит сбой, я выбираю «Отладка», а затем продолжаю на каждомнеобработанное исключение, обработчик в конечном счете вызывается, и ему также удается выписать значимый мини-дамп. Wtf?)

1 Ответ

2 голосов
/ 12 апреля 2011

Интересно. Выйдя на конечность, я держу пари, что среда выполнения параллелизма OpenMP не учитывает SetUnhandledExceptionFilter (который будет работать для «стандартных» потоков) и не интегрирована в эту функцию структурированной обработки исключений.

Обратите внимание на это предупреждение со страницы MSDN, посвященной обработке исключений во время выполнения параллелизма

To prevent abnormal termination of your application, make sure that your code handles exceptions when it calls into the runtime. Also handle exceptions when you call into external code that uses the Concurrency Runtime, for example, a third-party library.

Возможно, вы можете попробовать обернуть ваши OpenMP-вещи в стиль обработки исключений, описанный выше, а затем посмотреть, сможете ли вы упаковать и выбросить его (вне контекста OpenMP), чтобы его поймал фильтр?

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