diff options
Diffstat (limited to 'src/runtime/testdata/testwinlib')
| -rw-r--r-- | src/runtime/testdata/testwinlib/main.c | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/src/runtime/testdata/testwinlib/main.c b/src/runtime/testdata/testwinlib/main.c index 55ee6571d7..e9b5946a31 100644 --- a/src/runtime/testdata/testwinlib/main.c +++ b/src/runtime/testdata/testwinlib/main.c @@ -4,6 +4,8 @@ int exceptionCount; int continueCount; +int unhandledCount; + LONG WINAPI customExceptionHandlder(struct _EXCEPTION_POINTERS *ExceptionInfo) { if (ExceptionInfo->ExceptionRecord->ExceptionCode == EXCEPTION_BREAKPOINT) @@ -20,7 +22,10 @@ LONG WINAPI customExceptionHandlder(struct _EXCEPTION_POINTERS *ExceptionInfo) #else c->Pc = c->Lr; #endif +#ifdef _ARM64_ + // TODO: remove when windows/arm64 supports SEH stack unwinding. return EXCEPTION_CONTINUE_EXECUTION; +#endif } return EXCEPTION_CONTINUE_SEARCH; } @@ -29,6 +34,14 @@ LONG WINAPI customContinueHandlder(struct _EXCEPTION_POINTERS *ExceptionInfo) if (ExceptionInfo->ExceptionRecord->ExceptionCode == EXCEPTION_BREAKPOINT) { continueCount++; + } + return EXCEPTION_CONTINUE_SEARCH; +} + +LONG WINAPI unhandledExceptionHandler(struct _EXCEPTION_POINTERS *ExceptionInfo) { + if (ExceptionInfo->ExceptionRecord->ExceptionCode == EXCEPTION_BREAKPOINT) + { + unhandledCount++; return EXCEPTION_CONTINUE_EXECUTION; } return EXCEPTION_CONTINUE_SEARCH; @@ -58,10 +71,15 @@ int main() fflush(stdout); return 2; } + void *prevUnhandledHandler = SetUnhandledExceptionFilter(unhandledExceptionHandler); CallMeBack(throwFromC); RemoveVectoredContinueHandler(continueHandlerHandle); RemoveVectoredExceptionHandler(exceptionHandlerHandle); - printf("exceptionCount: %d\ncontinueCount: %d\n", exceptionCount, continueCount); + if (prevUnhandledHandler != NULL) + { + SetUnhandledExceptionFilter(prevUnhandledHandler); + } + printf("exceptionCount: %d\ncontinueCount: %d\nunhandledCount: %d\n", exceptionCount, continueCount, unhandledCount); fflush(stdout); return 0; } |
