comparison src/os/windows/vm/os_windows.cpp @ 2068:1e637defdda6

6961186: Better VM handling of unexpected exceptions from application native code Summary: Trap uncaught C++ exception on Windows and Solaris and generate hs_err report. Reviewed-by: coleenp, bobv, dholmes
author zgu
date Wed, 22 Dec 2010 11:24:21 -0500
parents 54f5dd2aa1d9
children c19157304e08
comparison
equal deleted inserted replaced
2025:b03e6b4c7c75 2068:1e637defdda6
1 /* 1 /*
2 * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. 2 * CopyrighT (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 * 4 *
5 * This code is free software; you can redistribute it and/or modify it 5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as 6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. 7 * published by the Free Software Foundation.
2005 struct siglabel { 2005 struct siglabel {
2006 char *name; 2006 char *name;
2007 int number; 2007 int number;
2008 }; 2008 };
2009 2009
2010 // All Visual C++ exceptions thrown from code generated by the Microsoft Visual
2011 // C++ compiler contain this error code. Because this is a compiler-generated
2012 // error, the code is not listed in the Win32 API header files.
2013 // The code is actually a cryptic mnemonic device, with the initial "E"
2014 // standing for "exception" and the final 3 bytes (0x6D7363) representing the
2015 // ASCII values of "msc".
2016
2017 #define EXCEPTION_UNCAUGHT_CXX_EXCEPTION 0xE06D7363
2018
2019
2010 struct siglabel exceptlabels[] = { 2020 struct siglabel exceptlabels[] = {
2011 def_excpt(EXCEPTION_ACCESS_VIOLATION), 2021 def_excpt(EXCEPTION_ACCESS_VIOLATION),
2012 def_excpt(EXCEPTION_DATATYPE_MISALIGNMENT), 2022 def_excpt(EXCEPTION_DATATYPE_MISALIGNMENT),
2013 def_excpt(EXCEPTION_BREAKPOINT), 2023 def_excpt(EXCEPTION_BREAKPOINT),
2014 def_excpt(EXCEPTION_SINGLE_STEP), 2024 def_excpt(EXCEPTION_SINGLE_STEP),
2029 def_excpt(EXCEPTION_NONCONTINUABLE_EXCEPTION), 2039 def_excpt(EXCEPTION_NONCONTINUABLE_EXCEPTION),
2030 def_excpt(EXCEPTION_STACK_OVERFLOW), 2040 def_excpt(EXCEPTION_STACK_OVERFLOW),
2031 def_excpt(EXCEPTION_INVALID_DISPOSITION), 2041 def_excpt(EXCEPTION_INVALID_DISPOSITION),
2032 def_excpt(EXCEPTION_GUARD_PAGE), 2042 def_excpt(EXCEPTION_GUARD_PAGE),
2033 def_excpt(EXCEPTION_INVALID_HANDLE), 2043 def_excpt(EXCEPTION_INVALID_HANDLE),
2044 def_excpt(EXCEPTION_UNCAUGHT_CXX_EXCEPTION),
2034 NULL, 0 2045 NULL, 0
2035 }; 2046 };
2036 2047
2037 const char* os::exception_name(int exception_code, char *buf, size_t size) { 2048 const char* os::exception_name(int exception_code, char *buf, size_t size) {
2038 for (int i = 0; exceptlabels[i].name != NULL; i++) { 2049 for (int i = 0; exceptlabels[i].name != NULL; i++) {
2261 // Block current thread until the memory serialize page permission restored. 2272 // Block current thread until the memory serialize page permission restored.
2262 os::block_on_serialize_page_trap(); 2273 os::block_on_serialize_page_trap();
2263 return EXCEPTION_CONTINUE_EXECUTION; 2274 return EXCEPTION_CONTINUE_EXECUTION;
2264 } 2275 }
2265 } 2276 }
2266
2267 2277
2268 if (t != NULL && t->is_Java_thread()) { 2278 if (t != NULL && t->is_Java_thread()) {
2269 JavaThread* thread = (JavaThread*) t; 2279 JavaThread* thread = (JavaThread*) t;
2270 bool in_java = thread->thread_state() == _thread_in_Java; 2280 bool in_java = thread->thread_state() == _thread_in_Java;
2271 2281
2466 return Handle_IDiv_Exception(exceptionInfo); 2476 return Handle_IDiv_Exception(exceptionInfo);
2467 2477
2468 } // switch 2478 } // switch
2469 } 2479 }
2470 #ifndef _WIN64 2480 #ifndef _WIN64
2471 if ((thread->thread_state() == _thread_in_Java) || 2481 if (((thread->thread_state() == _thread_in_Java) ||
2472 (thread->thread_state() == _thread_in_native) ) 2482 (thread->thread_state() == _thread_in_native)) &&
2483 exception_code != EXCEPTION_UNCAUGHT_CXX_EXCEPTION)
2473 { 2484 {
2474 LONG result=Handle_FLT_Exception(exceptionInfo); 2485 LONG result=Handle_FLT_Exception(exceptionInfo);
2475 if (result==EXCEPTION_CONTINUE_EXECUTION) return result; 2486 if (result==EXCEPTION_CONTINUE_EXECUTION) return result;
2476 } 2487 }
2477 #endif //_WIN64 2488 #endif //_WIN64
2491 case EXCEPTION_STACK_OVERFLOW: 2502 case EXCEPTION_STACK_OVERFLOW:
2492 case EXCEPTION_ILLEGAL_INSTRUCTION: 2503 case EXCEPTION_ILLEGAL_INSTRUCTION:
2493 case EXCEPTION_ILLEGAL_INSTRUCTION_2: 2504 case EXCEPTION_ILLEGAL_INSTRUCTION_2:
2494 case EXCEPTION_INT_OVERFLOW: 2505 case EXCEPTION_INT_OVERFLOW:
2495 case EXCEPTION_INT_DIVIDE_BY_ZERO: 2506 case EXCEPTION_INT_DIVIDE_BY_ZERO:
2507 case EXCEPTION_UNCAUGHT_CXX_EXCEPTION:
2496 { report_error(t, exception_code, pc, exceptionInfo->ExceptionRecord, 2508 { report_error(t, exception_code, pc, exceptionInfo->ExceptionRecord,
2497 exceptionInfo->ContextRecord); 2509 exceptionInfo->ContextRecord);
2498 } 2510 }
2499 break; 2511 break;
2500 default: 2512 default: