ntdll: Print a warning or an error for other exceptions.
Depending on EH_NONCONTINUABLE. Signed-off-by: Rémi Bernon <rbernon@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
30ecf517e4
commit
da3be6b0b6
|
@ -61,6 +61,44 @@ static RTL_CRITICAL_SECTION vectored_handlers_section = { &critsect_debug, -1, 0
|
|||
|
||||
static PRTL_EXCEPTION_FILTER unhandled_exception_filter;
|
||||
|
||||
const char *debugstr_exception_code( DWORD code )
|
||||
{
|
||||
switch (code)
|
||||
{
|
||||
case CONTROL_C_EXIT: return "CONTROL_C_EXIT";
|
||||
case DBG_CONTROL_C: return "DBG_CONTROL_C";
|
||||
case DBG_PRINTEXCEPTION_C: return "DBG_PRINTEXCEPTION_C";
|
||||
case DBG_PRINTEXCEPTION_WIDE_C: return "DBG_PRINTEXCEPTION_WIDE_C";
|
||||
case EXCEPTION_ACCESS_VIOLATION: return "EXCEPTION_ACCESS_VIOLATION";
|
||||
case EXCEPTION_ARRAY_BOUNDS_EXCEEDED: return "EXCEPTION_ARRAY_BOUNDS_EXCEEDED";
|
||||
case EXCEPTION_BREAKPOINT: return "EXCEPTION_BREAKPOINT";
|
||||
case EXCEPTION_DATATYPE_MISALIGNMENT: return "EXCEPTION_DATATYPE_MISALIGNMENT";
|
||||
case EXCEPTION_FLT_DENORMAL_OPERAND: return "EXCEPTION_FLT_DENORMAL_OPERAND";
|
||||
case EXCEPTION_FLT_DIVIDE_BY_ZERO: return "EXCEPTION_FLT_DIVIDE_BY_ZERO";
|
||||
case EXCEPTION_FLT_INEXACT_RESULT: return "EXCEPTION_FLT_INEXACT_RESULT";
|
||||
case EXCEPTION_FLT_INVALID_OPERATION: return "EXCEPTION_FLT_INVALID_OPERATION";
|
||||
case EXCEPTION_FLT_OVERFLOW: return "EXCEPTION_FLT_OVERFLOW";
|
||||
case EXCEPTION_FLT_STACK_CHECK: return "EXCEPTION_FLT_STACK_CHECK";
|
||||
case EXCEPTION_FLT_UNDERFLOW: return "EXCEPTION_FLT_UNDERFLOW";
|
||||
case EXCEPTION_GUARD_PAGE: return "EXCEPTION_GUARD_PAGE";
|
||||
case EXCEPTION_ILLEGAL_INSTRUCTION: return "EXCEPTION_ILLEGAL_INSTRUCTION";
|
||||
case EXCEPTION_IN_PAGE_ERROR: return "EXCEPTION_IN_PAGE_ERROR";
|
||||
case EXCEPTION_INT_DIVIDE_BY_ZERO: return "EXCEPTION_INT_DIVIDE_BY_ZERO";
|
||||
case EXCEPTION_INT_OVERFLOW: return "EXCEPTION_INT_OVERFLOW";
|
||||
case EXCEPTION_INVALID_DISPOSITION: return "EXCEPTION_INVALID_DISPOSITION";
|
||||
case EXCEPTION_INVALID_HANDLE: return "EXCEPTION_INVALID_HANDLE";
|
||||
case EXCEPTION_NONCONTINUABLE_EXCEPTION: return "EXCEPTION_NONCONTINUABLE_EXCEPTION";
|
||||
case EXCEPTION_PRIV_INSTRUCTION: return "EXCEPTION_PRIV_INSTRUCTION";
|
||||
case EXCEPTION_SINGLE_STEP: return "EXCEPTION_SINGLE_STEP";
|
||||
case EXCEPTION_STACK_OVERFLOW: return "EXCEPTION_STACK_OVERFLOW";
|
||||
case EXCEPTION_WINE_ASSERTION: return "EXCEPTION_WINE_ASSERTION";
|
||||
case EXCEPTION_WINE_CXX_EXCEPTION: return "EXCEPTION_WINE_CXX_EXCEPTION";
|
||||
case EXCEPTION_WINE_NAME_THREAD: return "EXCEPTION_WINE_NAME_THREAD";
|
||||
case EXCEPTION_WINE_STUB: return "EXCEPTION_WINE_STUB";
|
||||
}
|
||||
return "unknown";
|
||||
}
|
||||
|
||||
|
||||
static VECTORED_HANDLER *add_vectored_handler( struct list *handler_list, ULONG first,
|
||||
PVECTORED_EXCEPTION_HANDLER func )
|
||||
|
|
|
@ -55,6 +55,7 @@ extern RUNTIME_FUNCTION *lookup_function_info( ULONG_PTR pc, ULONG_PTR *base, LD
|
|||
|
||||
/* debug helpers */
|
||||
extern LPCSTR debugstr_us( const UNICODE_STRING *str ) DECLSPEC_HIDDEN;
|
||||
extern const char *debugstr_exception_code( DWORD code ) DECLSPEC_HIDDEN;
|
||||
|
||||
/* init routines */
|
||||
extern void version_init(void) DECLSPEC_HIDDEN;
|
||||
|
|
|
@ -174,6 +174,11 @@ NTSTATUS WINAPI KiUserExceptionDispatcher( EXCEPTION_RECORD *rec, CONTEXT *conte
|
|||
}
|
||||
else
|
||||
{
|
||||
if (rec->ExceptionFlags & EH_NONCONTINUABLE)
|
||||
ERR( "Fatal %s exception (code=%x) raised\n", debugstr_exception_code(rec->ExceptionCode), rec->ExceptionCode );
|
||||
else
|
||||
WARN( "%s exception (code=%x) raised\n", debugstr_exception_code(rec->ExceptionCode), rec->ExceptionCode );
|
||||
|
||||
TRACE( " r0=%08x r1=%08x r2=%08x r3=%08x r4=%08x r5=%08x\n",
|
||||
context->R0, context->R1, context->R2, context->R3, context->R4, context->R5 );
|
||||
TRACE( " r6=%08x r7=%08x r8=%08x r9=%08x r10=%08x r11=%08x\n",
|
||||
|
|
|
@ -515,6 +515,11 @@ NTSTATUS WINAPI KiUserExceptionDispatcher( EXCEPTION_RECORD *rec, CONTEXT *conte
|
|||
}
|
||||
else
|
||||
{
|
||||
if (rec->ExceptionFlags & EH_NONCONTINUABLE)
|
||||
ERR( "Fatal %s exception (code=%x) raised\n", debugstr_exception_code(rec->ExceptionCode), rec->ExceptionCode );
|
||||
else
|
||||
WARN( "%s exception (code=%x) raised\n", debugstr_exception_code(rec->ExceptionCode), rec->ExceptionCode );
|
||||
|
||||
TRACE(" x0=%016lx x1=%016lx x2=%016lx x3=%016lx\n",
|
||||
context->u.s.X0, context->u.s.X1, context->u.s.X2, context->u.s.X3 );
|
||||
TRACE(" x4=%016lx x5=%016lx x6=%016lx x7=%016lx\n",
|
||||
|
|
|
@ -206,6 +206,11 @@ NTSTATUS WINAPI dispatch_exception( EXCEPTION_RECORD *rec, CONTEXT *context )
|
|||
}
|
||||
else
|
||||
{
|
||||
if (rec->ExceptionFlags & EH_NONCONTINUABLE)
|
||||
ERR( "Fatal %s exception (code=%x) raised\n", debugstr_exception_code(rec->ExceptionCode), rec->ExceptionCode );
|
||||
else
|
||||
WARN( "%s exception (code=%x) raised\n", debugstr_exception_code(rec->ExceptionCode), rec->ExceptionCode );
|
||||
|
||||
TRACE(" eax=%08x ebx=%08x ecx=%08x edx=%08x esi=%08x edi=%08x\n",
|
||||
context->Eax, context->Ebx, context->Ecx,
|
||||
context->Edx, context->Esi, context->Edi );
|
||||
|
|
|
@ -552,6 +552,11 @@ NTSTATUS WINAPI dispatch_exception( EXCEPTION_RECORD *rec, CONTEXT *context )
|
|||
}
|
||||
else
|
||||
{
|
||||
if (rec->ExceptionFlags & EH_NONCONTINUABLE)
|
||||
ERR( "Fatal %s exception (code=%x) raised\n", debugstr_exception_code(rec->ExceptionCode), rec->ExceptionCode );
|
||||
else
|
||||
WARN( "%s exception (code=%x) raised\n", debugstr_exception_code(rec->ExceptionCode), rec->ExceptionCode );
|
||||
|
||||
TRACE(" rax=%016lx rbx=%016lx rcx=%016lx rdx=%016lx\n",
|
||||
context->Rax, context->Rbx, context->Rcx, context->Rdx );
|
||||
TRACE(" rsi=%016lx rdi=%016lx rbp=%016lx rsp=%016lx\n",
|
||||
|
|
|
@ -308,6 +308,15 @@ static inline EXCEPTION_REGISTRATION_RECORD *__wine_get_frame(void)
|
|||
for more info. */
|
||||
#define EXCEPTION_WINE_NAME_THREAD 0x406D1388
|
||||
|
||||
/* used for C++ exceptions in msvcrt
|
||||
* parameters:
|
||||
* [0] CXX_FRAME_MAGIC
|
||||
* [1] pointer to exception object
|
||||
* [2] pointer to type
|
||||
*/
|
||||
#define EXCEPTION_WINE_CXX_EXCEPTION 0xe06d7363
|
||||
#define EXCEPTION_WINE_CXX_FRAME_MAGIC 0x19930520
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -146,15 +146,6 @@ struct dbg_breakpoint
|
|||
struct expr* condition;
|
||||
};
|
||||
|
||||
/* used for C++ exceptions in msvcrt
|
||||
* parameters:
|
||||
* [0] CXX_FRAME_MAGIC
|
||||
* [1] pointer to exception object
|
||||
* [2] pointer to type
|
||||
*/
|
||||
#define CXX_EXCEPTION 0xe06d7363
|
||||
#define CXX_FRAME_MAGIC 0x19930520
|
||||
|
||||
/* Helper structure */
|
||||
typedef struct tagTHREADNAME_INFO
|
||||
{
|
||||
|
|
|
@ -951,11 +951,11 @@ void info_win32_exception(void)
|
|||
case EXCEPTION_FLT_STACK_CHECK:
|
||||
dbg_printf("floating point stack check");
|
||||
break;
|
||||
case CXX_EXCEPTION:
|
||||
if(rec->NumberParameters == 3 && rec->ExceptionInformation[0] == CXX_FRAME_MAGIC)
|
||||
case EXCEPTION_WINE_CXX_EXCEPTION:
|
||||
if(rec->NumberParameters == 3 && rec->ExceptionInformation[0] == EXCEPTION_WINE_CXX_FRAME_MAGIC)
|
||||
dbg_printf("C++ exception(object = 0x%08lx, type = 0x%08lx)",
|
||||
rec->ExceptionInformation[1], rec->ExceptionInformation[2]);
|
||||
else if(rec->NumberParameters == 4 && rec->ExceptionInformation[0] == CXX_FRAME_MAGIC)
|
||||
else if(rec->NumberParameters == 4 && rec->ExceptionInformation[0] == EXCEPTION_WINE_CXX_FRAME_MAGIC)
|
||||
dbg_printf("C++ exception(object = %p, type = %p, base = %p)",
|
||||
(void*)rec->ExceptionInformation[1], (void*)rec->ExceptionInformation[2],
|
||||
(void*)rec->ExceptionInformation[3]);
|
||||
|
|
Loading…
Reference in New Issue