c ++ - Optagelse af OpenMP-undtagelser med SetUnhandledExceptionFilter

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har en undtagelseshandler oprettet ved hjælp af SetUnhandledExceptionFilter, som fungerer fint. Men hvis jeg kaster en undtagelse fra OpenMP-koden, får jeg standarden 'programmet nedbrudt' vinduet, og håndteringen kaldes ikke - dog kan jeg bare vedhæfte en debugger og se, at opkaldsstakken slutter med \_CxxThrowException og fortsætter til KernelBase.dll! RaiseException. Jeg ved, at et OpenMP-program, der kaster undtagelser inde i parallelle regioner, er forkert, men jeg vil stadig have et krasjdump. Hvordan kan jeg få min undtagelseshandler få kaldt i dette tilfælde?


Det burde være muligt, især da debuggeren mangler at få et vindue 'Unhandled exception', når det er knyttet til applikationen efter nedbruddet (dvs. jeg kan få et godt stablingsspor og ting.) Dette er på Windows 7 med VC ++ 2010.


(Til sidst kalder hver tråd faktisk min undtagelseshåndterer. Hvis den går i stykker, og jeg vælger 'Fejlfinding', og derefter fortsætter hver uhåndteret undtagelse, bliver håndtereren til sidst opkaldt, og den klarer også at skrive en meningsfuld minidump. Wtf?)

Bedste reference


Interessant. Når jeg går ud på en lem, vil jeg vædre på, at OpenMP samtidighed runtime ikke hedder SetUnhandledExceptionFilter (som vil fungere for 'standard' tråde) og er ikke integreret i denne funktion af Structured Exception Handling.


Bemærk denne advarsel fra MSDN-siden om undtagelseshåndtering i samløbstidspunktet [3]


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.


Måske kan du prøve at indpakke dine OpenMP-emner i form af undtagelseshåndtering beskrevet ovenfor, og se, om du kan pakke om og smide det (uden for OpenMP-kontekst) for at blive fanget af filteret?