[RFC] creating Wine's own 'assert' variant
Lionel Ulmer
lionel.ulmer at free.fr
Sun Oct 27 02:01:56 CST 2002
> A better approach would be to leave assert() alone, and raise an
> exception on the SIGABRT signal.
Hmmm, yeah, seems like a better solution. Does the attached patch seems
correct (at least on my testings, I got the debugger instead of an 'abort
message' on the terminal :-) ).
Changelog:
Raise an exception if any Wine or Winelib code does an assert.
Lionel
--
Lionel Ulmer - http://www.bbrox.org/
-------------- next part --------------
Index: dlls/ntdll/signal_i386.c
===================================================================
RCS file: /home/wine/wine/dlls/ntdll/signal_i386.c,v
retrieving revision 1.46
diff -u -r1.46 signal_i386.c
--- dlls/ntdll/signal_i386.c 12 Sep 2002 22:07:03 -0000 1.46
+++ dlls/ntdll/signal_i386.c 27 Oct 2002 08:00:01 -0000
@@ -1040,6 +1040,26 @@
}
}
+/**********************************************************************
+ * abrt_handler
+ *
+ * Handler for SIGABRT.
+ */
+static HANDLER_DEF(abrt_handler)
+{
+ EXCEPTION_RECORD rec;
+ CONTEXT context;
+
+ save_context( &context, HANDLER_CONTEXT );
+ rec.ExceptionCode = STATUS_NONCONTINUABLE_EXCEPTION;
+ rec.ExceptionFlags = EH_NONCONTINUABLE;
+ rec.ExceptionRecord = NULL;
+ rec.ExceptionAddress = (LPVOID)context.Eip;
+ rec.NumberParameters = 0;
+ EXC_RtlRaiseException( &rec, &context ); /* Should never return.. */
+ restore_context( &context, HANDLER_CONTEXT );
+}
+
/***********************************************************************
* set_handler
@@ -1124,6 +1144,7 @@
if (set_handler( SIGFPE, have_sigaltstack, (void (*)())fpe_handler ) == -1) goto error;
if (set_handler( SIGSEGV, have_sigaltstack, (void (*)())segv_handler ) == -1) goto error;
if (set_handler( SIGILL, have_sigaltstack, (void (*)())segv_handler ) == -1) goto error;
+ if (set_handler( SIGABRT, have_sigaltstack, (void (*)())abrt_handler ) == -1) goto error;
#ifdef SIGBUS
if (set_handler( SIGBUS, have_sigaltstack, (void (*)())segv_handler ) == -1) goto error;
#endif
Index: dlls/ntdll/signal_powerpc.c
===================================================================
RCS file: /home/wine/wine/dlls/ntdll/signal_powerpc.c,v
retrieving revision 1.4
diff -u -r1.4 signal_powerpc.c
--- dlls/ntdll/signal_powerpc.c 12 Sep 2002 22:07:03 -0000 1.4
+++ dlls/ntdll/signal_powerpc.c 27 Oct 2002 08:00:01 -0000
@@ -381,6 +381,26 @@
}
}
+/**********************************************************************
+ * abrt_handler
+ *
+ * Handler for SIGABRT.
+ */
+static HANDLER_DEF(abrt_handler)
+{
+ EXCEPTION_RECORD rec;
+ CONTEXT context;
+
+ save_context( &context, HANDLER_CONTEXT );
+ rec.ExceptionCode = STATUS_NONCONTINUABLE_EXCEPTION;
+ rec.ExceptionFlags = EH_NONCONTINUABLE;
+ rec.ExceptionRecord = NULL;
+ rec.ExceptionAddress = (LPVOID)context.Eip;
+ rec.NumberParameters = 0;
+ EXC_RtlRaiseException( &rec, &context ); /* Should never return.. */
+ restore_context( &context, HANDLER_CONTEXT );
+}
+
/***********************************************************************
* set_handler
@@ -440,6 +460,7 @@
if (set_handler( SIGFPE, have_sigaltstack, (void (*)())fpe_handler ) == -1) goto error;
if (set_handler( SIGSEGV, have_sigaltstack, (void (*)())segv_handler ) == -1) goto error;
if (set_handler( SIGILL, have_sigaltstack, (void (*)())segv_handler ) == -1) goto error;
+ if (set_handler( SIGABRT, have_sigaltstack, (void (*)())abrt_handler ) == -1) goto error;
#ifdef SIGBUS
if (set_handler( SIGBUS, have_sigaltstack, (void (*)())segv_handler ) == -1) goto error;
#endif
Index: dlls/ntdll/signal_sparc.c
===================================================================
RCS file: /home/wine/wine/dlls/ntdll/signal_sparc.c,v
retrieving revision 1.19
diff -u -r1.19 signal_sparc.c
--- dlls/ntdll/signal_sparc.c 12 Sep 2002 22:07:03 -0000 1.19
+++ dlls/ntdll/signal_sparc.c 27 Oct 2002 08:00:01 -0000
@@ -343,6 +343,25 @@
}
}
+/**********************************************************************
+ * abrt_handler
+ *
+ * Handler for SIGABRT.
+ */
+static HANDLER_DEF(abrt_handler)
+{
+ EXCEPTION_RECORD rec;
+ CONTEXT context;
+
+ save_context( &context, HANDLER_CONTEXT );
+ rec.ExceptionCode = STATUS_NONCONTINUABLE_EXCEPTION;
+ rec.ExceptionFlags = EH_NONCONTINUABLE;
+ rec.ExceptionRecord = NULL;
+ rec.ExceptionAddress = (LPVOID)context.Eip;
+ rec.NumberParameters = 0;
+ EXC_RtlRaiseException( &rec, &context ); /* Should never return.. */
+ restore_context( &context, HANDLER_CONTEXT );
+}
/***********************************************************************
* set_handler
@@ -398,7 +417,8 @@
if (set_handler( SIGILL, (void (*)())ill_handler ) == -1) goto error;
if (set_handler( SIGBUS, (void (*)())bus_handler ) == -1) goto error;
if (set_handler( SIGTRAP, (void (*)())trap_handler ) == -1) goto error;
- return TRUE;
+ if (set_handler( SIGABRT, (void (*)())abrt_handler ) == -1) goto error;
+ return TRUE;
error:
perror("sigaction");
More information about the wine-patches
mailing list