Constant spam from unwinding routines makes +seh logs hard to read, especially for programs that throw a lot of exceptions as part of normal execution. Since unwind information is rarely useful, don't display it unless specifically requested.
Make +unwind the default channel in these files, though, since there are more unwind messages than exception messages.
Signed-off-by: Zebediah Figura zfigura@codeweavers.com --- dlls/ntdll/signal_x86_64.c | 72 +++++++++++++++++---------------- dlls/ntdll/unix/signal_x86_64.c | 41 ++++++++++--------- 2 files changed, 58 insertions(+), 55 deletions(-)
diff --git a/dlls/ntdll/signal_x86_64.c b/dlls/ntdll/signal_x86_64.c index 19146aea40b..de0eca6c11c 100644 --- a/dlls/ntdll/signal_x86_64.c +++ b/dlls/ntdll/signal_x86_64.c @@ -34,7 +34,8 @@ #include "ntdll_misc.h" #include "wine/debug.h"
-WINE_DEFAULT_DEBUG_CHANNEL(seh); +WINE_DEFAULT_DEBUG_CHANNEL(unwind); +WINE_DECLARE_DEBUG_CHANNEL(seh);
typedef struct _SCOPE_TABLE { @@ -366,10 +367,10 @@ static DWORD call_handler( EXCEPTION_RECORD *rec, CONTEXT *context, DISPATCHER_C frame.Handler = nested_exception_handler; __wine_push_frame( &frame );
- TRACE( "calling handler %p (rec=%p, frame=%p context=%p, dispatch=%p)\n", - dispatch->LanguageHandler, rec, (void *)dispatch->EstablisherFrame, dispatch->ContextRecord, dispatch ); + TRACE_(seh)( "calling handler %p (rec=%p, frame=%p context=%p, dispatch=%p)\n", + dispatch->LanguageHandler, rec, (void *)dispatch->EstablisherFrame, dispatch->ContextRecord, dispatch ); res = dispatch->LanguageHandler( rec, (void *)dispatch->EstablisherFrame, context, dispatch ); - TRACE( "handler at %p returned %u\n", dispatch->LanguageHandler, res ); + TRACE_(seh)( "handler at %p returned %u\n", dispatch->LanguageHandler, res );
rec->ExceptionFlags &= EH_NONCONTINUABLE; __wine_pop_frame( &frame ); @@ -388,10 +389,10 @@ static DWORD call_teb_handler( EXCEPTION_RECORD *rec, CONTEXT *context, DISPATCH { DWORD res;
- TRACE( "calling TEB handler %p (rec=%p, frame=%p context=%p, dispatch=%p)\n", - teb_frame->Handler, rec, teb_frame, dispatch->ContextRecord, dispatch ); + TRACE_(seh)( "calling TEB handler %p (rec=%p, frame=%p context=%p, dispatch=%p)\n", + teb_frame->Handler, rec, teb_frame, dispatch->ContextRecord, dispatch ); res = teb_frame->Handler( rec, teb_frame, context, (EXCEPTION_REGISTRATION_RECORD**)dispatch ); - TRACE( "handler at %p returned %u\n", teb_frame->Handler, res ); + TRACE_(seh)( "handler at %p returned %u\n", teb_frame->Handler, res ); return res; }
@@ -427,8 +428,8 @@ static NTSTATUS call_stack_handlers( EXCEPTION_RECORD *rec, CONTEXT *orig_contex dispatch.EstablisherFrame < (ULONG64)NtCurrentTeb()->Tib.StackLimit || dispatch.EstablisherFrame > (ULONG64)NtCurrentTeb()->Tib.StackBase) { - ERR( "invalid frame %p (%p-%p)\n", (void *)dispatch.EstablisherFrame, - NtCurrentTeb()->Tib.StackLimit, NtCurrentTeb()->Tib.StackBase ); + ERR_(seh)( "invalid frame %p (%p-%p)\n", (void *)dispatch.EstablisherFrame, + NtCurrentTeb()->Tib.StackLimit, NtCurrentTeb()->Tib.StackBase ); rec->ExceptionFlags |= EH_STACK_INVALID; break; } @@ -443,7 +444,7 @@ static NTSTATUS call_stack_handlers( EXCEPTION_RECORD *rec, CONTEXT *orig_contex case ExceptionContinueSearch: break; case ExceptionNestedException: - FIXME( "nested exception\n" ); + FIXME_(seh)( "nested exception\n" ); break; case ExceptionCollidedUnwind: { ULONG64 frame; @@ -462,8 +463,8 @@ static NTSTATUS call_stack_handlers( EXCEPTION_RECORD *rec, CONTEXT *orig_contex /* hack: call wine handlers registered in the tib list */ else while ((ULONG64)teb_frame < context.Rsp) { - TRACE( "found wine frame %p rsp %p handler %p\n", - teb_frame, (void *)context.Rsp, teb_frame->Handler ); + TRACE_(seh)( "found wine frame %p rsp %p handler %p\n", + teb_frame, (void *)context.Rsp, teb_frame->Handler ); dispatch.EstablisherFrame = (ULONG64)teb_frame; switch (call_teb_handler( rec, orig_context, &dispatch, teb_frame )) { @@ -473,7 +474,7 @@ static NTSTATUS call_stack_handlers( EXCEPTION_RECORD *rec, CONTEXT *orig_contex case ExceptionContinueSearch: break; case ExceptionNestedException: - FIXME( "nested exception\n" ); + FIXME_(seh)( "nested exception\n" ); break; case ExceptionCollidedUnwind: { ULONG64 frame; @@ -503,9 +504,9 @@ NTSTATUS WINAPI dispatch_exception( EXCEPTION_RECORD *rec, CONTEXT *context ) NTSTATUS status; DWORD c;
- TRACE( "code=%x flags=%x addr=%p ip=%p tid=%04x\n", - rec->ExceptionCode, rec->ExceptionFlags, rec->ExceptionAddress, - (void *)context->Rip, GetCurrentThreadId() ); + TRACE_(seh)( "code=%x flags=%x addr=%p ip=%p tid=%04x\n", + rec->ExceptionCode, rec->ExceptionFlags, rec->ExceptionAddress, + (void *)context->Rip, GetCurrentThreadId() ); for (c = 0; c < min( EXCEPTION_MAXIMUM_PARAMETERS, rec->NumberParameters ); c++) TRACE( " info[%d]=%016I64x\n", c, rec->ExceptionInformation[c] );
@@ -522,31 +523,32 @@ NTSTATUS WINAPI dispatch_exception( EXCEPTION_RECORD *rec, CONTEXT *context ) } else if (rec->ExceptionCode == EXCEPTION_WINE_NAME_THREAD && rec->ExceptionInformation[0] == 0x1000) { - WARN( "Thread %04x renamed to %s\n", (DWORD)rec->ExceptionInformation[2], debugstr_a((char *)rec->ExceptionInformation[1]) ); + WARN_(seh)( "Thread %04x renamed to %s\n", (DWORD)rec->ExceptionInformation[2], + debugstr_a((char *)rec->ExceptionInformation[1]) ); } else if (rec->ExceptionCode == DBG_PRINTEXCEPTION_C) { - WARN( "%s\n", debugstr_an((char *)rec->ExceptionInformation[1], rec->ExceptionInformation[0] - 1) ); + WARN_(seh)( "%s\n", debugstr_an((char *)rec->ExceptionInformation[1], rec->ExceptionInformation[0] - 1) ); } else if (rec->ExceptionCode == DBG_PRINTEXCEPTION_WIDE_C) { - WARN( "%s\n", debugstr_wn((WCHAR *)rec->ExceptionInformation[1], rec->ExceptionInformation[0] - 1) ); + WARN_(seh)( "%s\n", debugstr_wn((WCHAR *)rec->ExceptionInformation[1], rec->ExceptionInformation[0] - 1) ); } else { if (rec->ExceptionCode == STATUS_ASSERTION_FAILURE) - ERR( "%s exception (code=%x) raised\n", debugstr_exception_code(rec->ExceptionCode), rec->ExceptionCode ); + ERR_(seh)( "%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 ); + WARN_(seh)( "%s exception (code=%x) raised\n", debugstr_exception_code(rec->ExceptionCode), rec->ExceptionCode );
- TRACE(" rax=%016I64x rbx=%016I64x rcx=%016I64x rdx=%016I64x\n", - context->Rax, context->Rbx, context->Rcx, context->Rdx ); - TRACE(" rsi=%016I64x rdi=%016I64x rbp=%016I64x rsp=%016I64x\n", - context->Rsi, context->Rdi, context->Rbp, context->Rsp ); - TRACE(" r8=%016I64x r9=%016I64x r10=%016I64x r11=%016I64x\n", - context->R8, context->R9, context->R10, context->R11 ); - TRACE(" r12=%016I64x r13=%016I64x r14=%016I64x r15=%016I64x\n", - context->R12, context->R13, context->R14, context->R15 ); + TRACE_(seh)( " rax=%016I64x rbx=%016I64x rcx=%016I64x rdx=%016I64x\n", + context->Rax, context->Rbx, context->Rcx, context->Rdx ); + TRACE_(seh)( " rsi=%016I64x rdi=%016I64x rbp=%016I64x rsp=%016I64x\n", + context->Rsi, context->Rdi, context->Rbp, context->Rsp ); + TRACE_(seh)( " r8=%016I64x r9=%016I64x r10=%016I64x r11=%016I64x\n", + context->R8, context->R9, context->R10, context->R11 ); + TRACE_(seh)( " r12=%016I64x r13=%016I64x r14=%016I64x r15=%016I64x\n", + context->R12, context->R13, context->R14, context->R15 ); }
/* Legends of Runeterra depends on having SegDs == SegSs in an exception @@ -1184,18 +1186,18 @@ void CDECL RtlRestoreContext( CONTEXT *context, EXCEPTION_RECORD *rec ) else if (rec && rec->ExceptionCode == STATUS_UNWIND_CONSOLIDATE && rec->NumberParameters >= 1) { PVOID (CALLBACK *consolidate)(EXCEPTION_RECORD *) = (void *)rec->ExceptionInformation[0]; - TRACE( "calling consolidate callback %p (rec=%p)\n", consolidate, rec ); + TRACE_(seh)( "calling consolidate callback %p (rec=%p)\n", consolidate, rec ); context->Rip = (ULONG64)call_consolidate_callback( context, consolidate, rec ); }
/* hack: remove no longer accessible TEB frames */ while ((ULONG64)teb_frame < context->Rsp) { - TRACE( "removing TEB frame: %p\n", teb_frame ); + TRACE_(seh)( "removing TEB frame: %p\n", teb_frame ); teb_frame = __wine_pop_frame( teb_frame ); }
- TRACE( "returning to %p stack %p\n", (void *)context->Rip, (void *)context->Rsp ); + TRACE_(seh)( "returning to %p stack %p\n", (void *)context->Rip, (void *)context->Rsp ); NtContinue( context, FALSE ); }
@@ -1358,7 +1360,7 @@ EXCEPTION_DISPOSITION WINAPI __C_specific_handler( EXCEPTION_RECORD *rec, SCOPE_TABLE *table = dispatch->HandlerData; ULONG i;
- TRACE( "%p %p %p %p\n", rec, frame, context, dispatch ); + TRACE_(seh)( "%p %p %p %p\n", rec, frame, context, dispatch ); if (TRACE_ON(seh)) dump_scope_table( dispatch->ImageBase, table );
if (rec->ExceptionFlags & (EH_UNWINDING | EH_EXIT_UNWIND)) @@ -1382,7 +1384,7 @@ EXCEPTION_DISPOSITION WINAPI __C_specific_handler( EXCEPTION_RECORD *rec, handler = (PTERMINATION_HANDLER)(dispatch->ImageBase + table->ScopeRecord[i].HandlerAddress); dispatch->ScopeIndex = i+1;
- TRACE( "calling __finally %p frame %p\n", handler, frame ); + TRACE_(seh)( "calling __finally %p frame %p\n", handler, frame ); handler( TRUE, frame ); } } @@ -1403,7 +1405,7 @@ EXCEPTION_DISPOSITION WINAPI __C_specific_handler( EXCEPTION_RECORD *rec, filter = (PEXCEPTION_FILTER)(dispatch->ImageBase + table->ScopeRecord[i].HandlerAddress); ptrs.ExceptionRecord = rec; ptrs.ContextRecord = context; - TRACE( "calling filter %p ptrs %p frame %p\n", filter, &ptrs, frame ); + TRACE_(seh)( "calling filter %p ptrs %p frame %p\n", filter, &ptrs, frame ); switch (filter( &ptrs, frame )) { case EXCEPTION_EXECUTE_HANDLER: diff --git a/dlls/ntdll/unix/signal_x86_64.c b/dlls/ntdll/unix/signal_x86_64.c index 6b668508d80..2769ebf24d6 100644 --- a/dlls/ntdll/unix/signal_x86_64.c +++ b/dlls/ntdll/unix/signal_x86_64.c @@ -81,7 +81,8 @@ #include "unix_private.h" #include "wine/debug.h"
-WINE_DEFAULT_DEBUG_CHANNEL(seh); +WINE_DEFAULT_DEBUG_CHANNEL(unwind); +WINE_DECLARE_DEBUG_CHANNEL(seh);
/*********************************************************************** * signal context platform-specific definitions @@ -2404,23 +2405,23 @@ static BOOL handle_syscall_fault( ucontext_t *sigcontext, EXCEPTION_RECORD *rec,
if (!is_inside_syscall( sigcontext )) return FALSE;
- TRACE( "code=%x flags=%x addr=%p ip=%lx tid=%04x\n", - rec->ExceptionCode, rec->ExceptionFlags, rec->ExceptionAddress, - context->Rip, GetCurrentThreadId() ); + TRACE_(seh)( "code=%x flags=%x addr=%p ip=%lx tid=%04x\n", + rec->ExceptionCode, rec->ExceptionFlags, rec->ExceptionAddress, + context->Rip, GetCurrentThreadId() ); for (i = 0; i < rec->NumberParameters; i++) - TRACE( " info[%d]=%016lx\n", i, rec->ExceptionInformation[i] ); - 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", - context->Rsi, context->Rdi, context->Rbp, context->Rsp ); - TRACE(" r8=%016lx r9=%016lx r10=%016lx r11=%016lx\n", - context->R8, context->R9, context->R10, context->R11 ); - TRACE(" r12=%016lx r13=%016lx r14=%016lx r15=%016lx\n", - context->R12, context->R13, context->R14, context->R15 ); + TRACE_(seh)( " info[%d]=%016lx\n", i, rec->ExceptionInformation[i] ); + TRACE_(seh)( " rax=%016lx rbx=%016lx rcx=%016lx rdx=%016lx\n", + context->Rax, context->Rbx, context->Rcx, context->Rdx ); + TRACE_(seh)( " rsi=%016lx rdi=%016lx rbp=%016lx rsp=%016lx\n", + context->Rsi, context->Rdi, context->Rbp, context->Rsp ); + TRACE_(seh)( " r8=%016lx r9=%016lx r10=%016lx r11=%016lx\n", + context->R8, context->R9, context->R10, context->R11 ); + TRACE_(seh)( " r12=%016lx r13=%016lx r14=%016lx r15=%016lx\n", + context->R12, context->R13, context->R14, context->R15 );
if (ntdll_get_thread_data()->jmp_buf) { - TRACE( "returning to handler\n" ); + TRACE_(seh)( "returning to handler\n" ); RCX_sig(sigcontext) = (ULONG_PTR)ntdll_get_thread_data()->jmp_buf; RDX_sig(sigcontext) = 1; RIP_sig(sigcontext) = (ULONG_PTR)__wine_longjmp; @@ -2428,7 +2429,7 @@ static BOOL handle_syscall_fault( ucontext_t *sigcontext, EXCEPTION_RECORD *rec, } else { - TRACE( "returning to user mode ip=%016lx ret=%08x\n", frame->rip, rec->ExceptionCode ); + TRACE_(seh)( "returning to user mode ip=%016lx ret=%08x\n", frame->rip, rec->ExceptionCode ); RCX_sig(sigcontext) = (ULONG_PTR)frame; RDX_sig(sigcontext) = rec->ExceptionCode; RIP_sig(sigcontext) = (ULONG_PTR)__wine_syscall_dispatcher_return; @@ -2451,8 +2452,8 @@ static BOOL handle_syscall_trap( ucontext_t *sigcontext )
if ((void *)RIP_sig( sigcontext ) != __wine_syscall_dispatcher) return FALSE;
- TRACE( "ignoring trap in syscall rip=%p eflags=%08x\n", - (void *)RIP_sig(sigcontext), (ULONG)EFL_sig(sigcontext) ); + TRACE_(seh)( "ignoring trap in syscall rip=%p eflags=%08x\n", + (void *)RIP_sig(sigcontext), (ULONG)EFL_sig(sigcontext) );
frame->rip = *(ULONG64 *)RSP_sig( sigcontext ); frame->eflags = EFL_sig(sigcontext); @@ -2528,7 +2529,7 @@ static void segv_handler( int signal, siginfo_t *siginfo, void *sigcontext ) rec.ExceptionCode = EXCEPTION_DATATYPE_MISALIGNMENT; break; default: - ERR( "Got unexpected trap %ld\n", (ULONG_PTR)TRAP_sig(ucontext) ); + ERR_(seh)( "Got unexpected trap %ld\n", (ULONG_PTR)TRAP_sig(ucontext) ); /* fall through */ case TRAP_x86_NMI: /* NMI interrupt */ case TRAP_x86_DNA: /* Device not available exception */ @@ -2832,7 +2833,7 @@ void signal_init_thread( TEB *teb ) #ifdef __GNUC__ __asm__ volatile ("fninit; fldcw %0" : : "m" (fpu_cw)); #else - FIXME("FPU setup not implemented for this platform.\n"); + FIXME_(seh)("FPU setup not implemented for this platform.\n"); #endif }
@@ -2868,7 +2869,7 @@ void signal_init_process(void) __wine_syscall_flags |= SYSCALL_HAVE_PTHREAD_TEB; if (getauxval( AT_HWCAP2 ) & 2) __wine_syscall_flags |= SYSCALL_HAVE_WRFSGSBASE; } - else ERR( "failed to allocate %%fs selector\n" ); + else ERR_(seh)( "failed to allocate %%fs selector\n" ); } #endif