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(a)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
--
2.30.2