Re: gdb exceptions patch

"Jeremy Bettis" <jeremy-PhGaUD7sGqRWk0Htik3J/[email protected]> Wed, 10 Sep 2003 08:34:46 -0500
Newsgroups gmane.comp.gnu.mingw.patches
Message-ID <[email protected]>
You like this one better?

----- Original Message ----- 
From: "Earnie Boyd" <[email protected]>
To: <[email protected]>
Sent: Tuesday, September 09, 2003 5:37 PM
Subject: Re: [MinGW-patches] gdb exceptions patch


> Please resubmit without the code alignment changes.  Also, please give
> your changes to the gdb maintainer for consideration to the source.  The
> correct email address is [email protected]  See
> http://www.gnu.org/software/gdb/ for more info.
>
> Earnie.
>
> Jeremy Bettis wrote:
> > When debugging a program that uses windows SEH gdb stops the program
even if
> > the inferior's exception handler catches the exception.  I have added a
new
> > set option, "set mapexceptionstosignals off" that will cause gdb to
> > completely ignore WIN32 exceptions. This is similar to the feature "set
> > signal-exceptions 4" in the Apple Openstep version of gdb 4.15.3.
> >
> >
> >
> > I know that gcc doesn't generate SEH, but I have a 3rd party lib that I
am
> > linking against, and it makes it real hard to debug when gdb insists on
> > terminating my process.
> >
> >
> > ------------------------------------------------------------------------
> >
> > diff -u -r gdb-5.2.1/gdb/win32-nat.c gdb-mine/gdb/win32-nat.c
> > --- gdb-5.2.1/gdb/win32-nat.c Sun Feb 16 16:03:19 2003
> > +++ gdb-mine/gdb/win32-nat.c Tue Sep  9 13:38:27 2003
> > @@ -200,6 +200,7 @@
> >  static int debug_memory = 0; /* show target memory accesses */
> >  static int debug_exceptions = 0; /* show target exceptions */
> >  static int useshell = 0; /* use shell for subprocesses */
> > +static int mapexceptionstosignals = 1; /* map exceptionstosignals */
> >
> >  /* This vector maps GDB's idea of a register's number into an address
> >     in the win32 exception context vector.
> > @@ -1024,93 +1025,123 @@
> >    /* Record the context of the current thread */
> >    th = thread_rec (current_event.dwThreadId, -1);
> >
> > -  switch (code)
> > -    {
> > -    case EXCEPTION_ACCESS_VIOLATION:
> > -      DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_ACCESS_VIOLATION");
> > -      ourstatus->value.sig = TARGET_SIGNAL_SEGV;
> > -      break;
> > -    case STATUS_STACK_OVERFLOW:
> > -      DEBUG_EXCEPTION_SIMPLE ("STATUS_STACK_OVERFLOW");
> > -      ourstatus->value.sig = TARGET_SIGNAL_SEGV;
> > -      break;
> > -    case STATUS_FLOAT_DENORMAL_OPERAND:
> > -      DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_DENORMAL_OPERAND");
> > -      ourstatus->value.sig = TARGET_SIGNAL_FPE;
> > -      break;
> > -    case EXCEPTION_ARRAY_BOUNDS_EXCEEDED:
> > -      DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_ARRAY_BOUNDS_EXCEEDED");
> > -      ourstatus->value.sig = TARGET_SIGNAL_FPE;
> > -      break;
> > -    case STATUS_FLOAT_INEXACT_RESULT:
> > -      DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_INEXACT_RESULT");
> > -      ourstatus->value.sig = TARGET_SIGNAL_FPE;
> > -      break;
> > -    case STATUS_FLOAT_INVALID_OPERATION:
> > -      DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_INVALID_OPERATION");
> > -      ourstatus->value.sig = TARGET_SIGNAL_FPE;
> > -      break;
> > -    case STATUS_FLOAT_OVERFLOW:
> > -      DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_OVERFLOW");
> > -      ourstatus->value.sig = TARGET_SIGNAL_FPE;
> > -      break;
> > -    case STATUS_FLOAT_STACK_CHECK:
> > -      DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_STACK_CHECK");
> > -      ourstatus->value.sig = TARGET_SIGNAL_FPE;
> > -      break;
> > -    case STATUS_FLOAT_UNDERFLOW:
> > -      DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_UNDERFLOW");
> > -      ourstatus->value.sig = TARGET_SIGNAL_FPE;
> > -      break;
> > -    case STATUS_FLOAT_DIVIDE_BY_ZERO:
> > -      DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_DIVIDE_BY_ZERO");
> > -      ourstatus->value.sig = TARGET_SIGNAL_FPE;
> > -      break;
> > -    case STATUS_INTEGER_DIVIDE_BY_ZERO:
> > -      DEBUG_EXCEPTION_SIMPLE ("STATUS_INTEGER_DIVIDE_BY_ZERO");
> > -      ourstatus->value.sig = TARGET_SIGNAL_FPE;
> > -      break;
> > -    case STATUS_INTEGER_OVERFLOW:
> > -      DEBUG_EXCEPTION_SIMPLE ("STATUS_INTEGER_OVERFLOW");
> > -      ourstatus->value.sig = TARGET_SIGNAL_FPE;
> > -      break;
> > -    case EXCEPTION_BREAKPOINT:
> > -      DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_BREAKPOINT");
> > -      ourstatus->value.sig = TARGET_SIGNAL_TRAP;
> > -      break;
> > -    case DBG_CONTROL_C:
> > -      DEBUG_EXCEPTION_SIMPLE ("DBG_CONTROL_C");
> > -      ourstatus->value.sig = TARGET_SIGNAL_INT;
> > -      break;
> > -    case DBG_CONTROL_BREAK:
> > -      DEBUG_EXCEPTION_SIMPLE ("DBG_CONTROL_BREAK");
> > -      ourstatus->value.sig = TARGET_SIGNAL_INT;
> > -      break;
> > -    case EXCEPTION_SINGLE_STEP:
> > -      DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_SINGLE_STEP");
> > -      ourstatus->value.sig = TARGET_SIGNAL_TRAP;
> > -      break;
> > -    case EXCEPTION_ILLEGAL_INSTRUCTION:
> > -      DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_ILLEGAL_INSTRUCTION");
> > -      ourstatus->value.sig = TARGET_SIGNAL_ILL;
> > -      break;
> > -    case EXCEPTION_PRIV_INSTRUCTION:
> > -      DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_PRIV_INSTRUCTION");
> > -      ourstatus->value.sig = TARGET_SIGNAL_ILL;
> > -      break;
> > -    case EXCEPTION_NONCONTINUABLE_EXCEPTION:
> > -      DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_NONCONTINUABLE_EXCEPTION");
> > -      ourstatus->value.sig = TARGET_SIGNAL_ILL;
> > -      break;
> > -    default:
> > -      if (current_event.u.Exception.dwFirstChance)
> > - return 0;
> > -      printf_unfiltered ("gdb: unknown target exception 0x%08lx at
0x%08lx\n",
> > -     current_event.u.Exception.ExceptionRecord.ExceptionCode,
> > - (DWORD) current_event.u.Exception.ExceptionRecord.ExceptionAddress);
> > -      ourstatus->value.sig = TARGET_SIGNAL_UNKNOWN;
> > -      break;
> > -    }
> > +  if (mapexceptionstosignals) {
> > +   switch (code)
> > +     {
> > +     case EXCEPTION_ACCESS_VIOLATION:
> > +       DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_ACCESS_VIOLATION");
> > +       ourstatus->value.sig = TARGET_SIGNAL_SEGV;
> > +       break;
> > +     case STATUS_STACK_OVERFLOW:
> > +       DEBUG_EXCEPTION_SIMPLE ("STATUS_STACK_OVERFLOW");
> > +       ourstatus->value.sig = TARGET_SIGNAL_SEGV;
> > +       break;
> > +     case STATUS_FLOAT_DENORMAL_OPERAND:
> > +       DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_DENORMAL_OPERAND");
> > +       ourstatus->value.sig = TARGET_SIGNAL_FPE;
> > +       break;
> > +     case EXCEPTION_ARRAY_BOUNDS_EXCEEDED:
> > +       DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_ARRAY_BOUNDS_EXCEEDED");
> > +       ourstatus->value.sig = TARGET_SIGNAL_FPE;
> > +       break;
> > +     case STATUS_FLOAT_INEXACT_RESULT:
> > +       DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_INEXACT_RESULT");
> > +       ourstatus->value.sig = TARGET_SIGNAL_FPE;
> > +       break;
> > +     case STATUS_FLOAT_INVALID_OPERATION:
> > +       DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_INVALID_OPERATION");
> > +       ourstatus->value.sig = TARGET_SIGNAL_FPE;
> > +       break;
> > +     case STATUS_FLOAT_OVERFLOW:
> > +       DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_OVERFLOW");
> > +       ourstatus->value.sig = TARGET_SIGNAL_FPE;
> > +       break;
> > +     case STATUS_FLOAT_STACK_CHECK:
> > +       DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_STACK_CHECK");
> > +       ourstatus->value.sig = TARGET_SIGNAL_FPE;
> > +       break;
> > +     case STATUS_FLOAT_UNDERFLOW:
> > +       DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_UNDERFLOW");
> > +       ourstatus->value.sig = TARGET_SIGNAL_FPE;
> > +       break;
> > +     case STATUS_FLOAT_DIVIDE_BY_ZERO:
> > +       DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_DIVIDE_BY_ZERO");
> > +       ourstatus->value.sig = TARGET_SIGNAL_FPE;
> > +       break;
> > +     case STATUS_INTEGER_DIVIDE_BY_ZERO:
> > +       DEBUG_EXCEPTION_SIMPLE ("STATUS_INTEGER_DIVIDE_BY_ZERO");
> > +       ourstatus->value.sig = TARGET_SIGNAL_FPE;
> > +       break;
> > +     case STATUS_INTEGER_OVERFLOW:
> > +       DEBUG_EXCEPTION_SIMPLE ("STATUS_INTEGER_OVERFLOW");
> > +       ourstatus->value.sig = TARGET_SIGNAL_FPE;
> > +       break;
> > +     case EXCEPTION_BREAKPOINT:
> > +       DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_BREAKPOINT");
> > +       ourstatus->value.sig = TARGET_SIGNAL_TRAP;
> > +       break;
> > +     case DBG_CONTROL_C:
> > +       DEBUG_EXCEPTION_SIMPLE ("DBG_CONTROL_C");
> > +       ourstatus->value.sig = TARGET_SIGNAL_INT;
> > +       break;
> > +     case DBG_CONTROL_BREAK:
> > +       DEBUG_EXCEPTION_SIMPLE ("DBG_CONTROL_BREAK");
> > +       ourstatus->value.sig = TARGET_SIGNAL_INT;
> > +       break;
> > +     case EXCEPTION_SINGLE_STEP:
> > +       DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_SINGLE_STEP");
> > +       ourstatus->value.sig = TARGET_SIGNAL_TRAP;
> > +       break;
> > +     case EXCEPTION_ILLEGAL_INSTRUCTION:
> > +       DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_ILLEGAL_INSTRUCTION");
> > +       ourstatus->value.sig = TARGET_SIGNAL_ILL;
> > +       break;
> > +     case EXCEPTION_PRIV_INSTRUCTION:
> > +       DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_PRIV_INSTRUCTION");
> > +       ourstatus->value.sig = TARGET_SIGNAL_ILL;
> > +       break;
> > +     case EXCEPTION_NONCONTINUABLE_EXCEPTION:
> > +       DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_NONCONTINUABLE_EXCEPTION");
> > +       ourstatus->value.sig = TARGET_SIGNAL_ILL;
> > +       break;
> > +     default:
> > +       if (current_event.u.Exception.dwFirstChance)
> > + return 0;
> > +       printf_unfiltered ("gdb: unknown target exception 0x%08lx at
0x%08lx\n",
> > +     current_event.u.Exception.ExceptionRecord.ExceptionCode,
> > + (DWORD) current_event.u.Exception.ExceptionRecord.ExceptionAddress);
> > +       ourstatus->value.sig = TARGET_SIGNAL_UNKNOWN;
> > +       break;
> > +     }
> > + } else {
> > +   switch (code)
> > +     {
> > +     case EXCEPTION_BREAKPOINT:
> > +       DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_BREAKPOINT");
> > +       ourstatus->value.sig = TARGET_SIGNAL_TRAP;
> > +       break;
> > +     case DBG_CONTROL_C:
> > +       DEBUG_EXCEPTION_SIMPLE ("DBG_CONTROL_C");
> > +       ourstatus->value.sig = TARGET_SIGNAL_INT;
> > +       break;
> > +     case DBG_CONTROL_BREAK:
> > +       DEBUG_EXCEPTION_SIMPLE ("DBG_CONTROL_BREAK");
> > +       ourstatus->value.sig = TARGET_SIGNAL_INT;
> > +       break;
> > +     case EXCEPTION_SINGLE_STEP:
> > +       DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_SINGLE_STEP");
> > +       ourstatus->value.sig = TARGET_SIGNAL_TRAP;
> > +       break;
> > +     default:
> > +       if (current_event.u.Exception.dwFirstChance)
> > + return 0;
> > +       printf_unfiltered ("gdb: unknown target exception 0x%08lx at
0x%08lx\n",
> > +     current_event.u.Exception.ExceptionRecord.ExceptionCode,
> > + (DWORD) current_event.u.Exception.ExceptionRecord.ExceptionAddress);
> > +       ourstatus->value.sig = TARGET_SIGNAL_UNKNOWN;
> > +       break;
> > +     }
> > + }
> >    exception_count++;
> >    last_sig = ourstatus->value.sig;
> >    return 1;
> > @@ -1172,6 +1203,7 @@
> >    thread_info *th = NULL;
> >    static thread_info dummy_thread_info;
> >    int retval = 0;
> >
> >    last_sig = TARGET_SIGNAL_0;
> >
> > @@ -1286,6 +1318,7 @@
> >       "EXCEPTION_DEBUG_EVENT"));
> >        if (saw_create != 1)
> >  break;
> > +   continue_status=DBG_EXCEPTION_NOT_HANDLED ;
> >        if (handle_exception (ourstatus))
> >  retval = current_event.dwThreadId;
> >        break;
> > @@ -1972,6 +2005,12 @@
> >    add_show_from_set (add_set_cmd ("debugexceptions", class_support,
var_boolean,
> >    (char *) &debug_exceptions,
> >         "Set whether to display kernel exceptions in child process.",
> > +   &setlist),
> > +      &showlist);
> > +
> > +  add_show_from_set (add_set_cmd ("mapexceptionstosignals",
class_support, var_boolean,
> > +   (char *) &mapexceptionstosignals,
> > +        "Set whether to convert WIN32 exceptions to gdb signals.",
> >    &setlist),
> >       &showlist);
>
>
>
> -------------------------------------------------------
> This sf.net email is sponsored by:ThinkGeek
> Welcome to geek heaven.
> http://thinkgeek.com/sf
> _______________________________________________
> MinGW-patches mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/mingw-patches
>
gdbpatch.txt (text/plain, 6 KB)
diff -u -r gdb-5.2.1/gdb/win32-nat.c gdb-mine/gdb/win32-nat.c
--- gdb-5.2.1/gdb/win32-nat.c	Sun Feb 16 16:03:19 2003
+++ gdb-mine/gdb/win32-nat.c	Tue Sep  9 13:38:27 2003
@@ -200,6 +200,7 @@
 static int debug_memory = 0;		/* show target memory accesses */
 static int debug_exceptions = 0;	/* show target exceptions */
 static int useshell = 0;		/* use shell for subprocesses */
+static int mapexceptionstosignals = 1;	/* map exceptionstosignals */
 
 /* This vector maps GDB's idea of a register's number into an address
    in the win32 exception context vector.
@@ -1024,93 +1025,123 @@
   /* Record the context of the current thread */
   th = thread_rec (current_event.dwThreadId, -1);
 
+  if (mapexceptionstosignals) {
   switch (code)
     {
     case EXCEPTION_ACCESS_VIOLATION:
       DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_ACCESS_VIOLATION");
       ourstatus->value.sig = TARGET_SIGNAL_SEGV;
       break;
     case STATUS_STACK_OVERFLOW:
       DEBUG_EXCEPTION_SIMPLE ("STATUS_STACK_OVERFLOW");
       ourstatus->value.sig = TARGET_SIGNAL_SEGV;
       break;
     case STATUS_FLOAT_DENORMAL_OPERAND:
       DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_DENORMAL_OPERAND");
       ourstatus->value.sig = TARGET_SIGNAL_FPE;
       break;
     case EXCEPTION_ARRAY_BOUNDS_EXCEEDED:
       DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_ARRAY_BOUNDS_EXCEEDED");
       ourstatus->value.sig = TARGET_SIGNAL_FPE;
       break;
     case STATUS_FLOAT_INEXACT_RESULT:
       DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_INEXACT_RESULT");
       ourstatus->value.sig = TARGET_SIGNAL_FPE;
       break;
     case STATUS_FLOAT_INVALID_OPERATION:
       DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_INVALID_OPERATION");
       ourstatus->value.sig = TARGET_SIGNAL_FPE;
       break;
     case STATUS_FLOAT_OVERFLOW:
       DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_OVERFLOW");
       ourstatus->value.sig = TARGET_SIGNAL_FPE;
       break;
     case STATUS_FLOAT_STACK_CHECK:
       DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_STACK_CHECK");
       ourstatus->value.sig = TARGET_SIGNAL_FPE;
       break;
     case STATUS_FLOAT_UNDERFLOW:
       DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_UNDERFLOW");
       ourstatus->value.sig = TARGET_SIGNAL_FPE;
       break;
     case STATUS_FLOAT_DIVIDE_BY_ZERO:
       DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_DIVIDE_BY_ZERO");
       ourstatus->value.sig = TARGET_SIGNAL_FPE;
       break;
     case STATUS_INTEGER_DIVIDE_BY_ZERO:
       DEBUG_EXCEPTION_SIMPLE ("STATUS_INTEGER_DIVIDE_BY_ZERO");
       ourstatus->value.sig = TARGET_SIGNAL_FPE;
       break;
     case STATUS_INTEGER_OVERFLOW:
       DEBUG_EXCEPTION_SIMPLE ("STATUS_INTEGER_OVERFLOW");
       ourstatus->value.sig = TARGET_SIGNAL_FPE;
       break;
     case EXCEPTION_BREAKPOINT:
       DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_BREAKPOINT");
       ourstatus->value.sig = TARGET_SIGNAL_TRAP;
       break;
     case DBG_CONTROL_C:
       DEBUG_EXCEPTION_SIMPLE ("DBG_CONTROL_C");
       ourstatus->value.sig = TARGET_SIGNAL_INT;
       break;
     case DBG_CONTROL_BREAK:
       DEBUG_EXCEPTION_SIMPLE ("DBG_CONTROL_BREAK");
       ourstatus->value.sig = TARGET_SIGNAL_INT;
       break;
     case EXCEPTION_SINGLE_STEP:
       DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_SINGLE_STEP");
       ourstatus->value.sig = TARGET_SIGNAL_TRAP;
       break;
     case EXCEPTION_ILLEGAL_INSTRUCTION:
       DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_ILLEGAL_INSTRUCTION");
       ourstatus->value.sig = TARGET_SIGNAL_ILL;
       break;
     case EXCEPTION_PRIV_INSTRUCTION:
       DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_PRIV_INSTRUCTION");
       ourstatus->value.sig = TARGET_SIGNAL_ILL;
       break;
     case EXCEPTION_NONCONTINUABLE_EXCEPTION:
       DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_NONCONTINUABLE_EXCEPTION");
       ourstatus->value.sig = TARGET_SIGNAL_ILL;
       break;
     default:
       if (current_event.u.Exception.dwFirstChance)
 	return 0;
       printf_unfiltered ("gdb: unknown target exception 0x%08lx at 0x%08lx\n",
 		    current_event.u.Exception.ExceptionRecord.ExceptionCode,
 	(DWORD) current_event.u.Exception.ExceptionRecord.ExceptionAddress);
       ourstatus->value.sig = TARGET_SIGNAL_UNKNOWN;
       break;
     }
+	} else {
+	  switch (code)
+	    {
+	    case EXCEPTION_BREAKPOINT:
+	      DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_BREAKPOINT");
+	      ourstatus->value.sig = TARGET_SIGNAL_TRAP;
+	      break;
+	    case DBG_CONTROL_C:
+	      DEBUG_EXCEPTION_SIMPLE ("DBG_CONTROL_C");
+	      ourstatus->value.sig = TARGET_SIGNAL_INT;
+	      break;
+	    case DBG_CONTROL_BREAK:
+	      DEBUG_EXCEPTION_SIMPLE ("DBG_CONTROL_BREAK");
+	      ourstatus->value.sig = TARGET_SIGNAL_INT;
+	      break;
+	    case EXCEPTION_SINGLE_STEP:
+	      DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_SINGLE_STEP");
+	      ourstatus->value.sig = TARGET_SIGNAL_TRAP;
+	      break;
+	    default:
+	      if (current_event.u.Exception.dwFirstChance)
+		return 0;
+	      printf_unfiltered ("gdb: unknown target exception 0x%08lx at 0x%08lx\n",
+			    current_event.u.Exception.ExceptionRecord.ExceptionCode,
+		(DWORD) current_event.u.Exception.ExceptionRecord.ExceptionAddress);
+	      ourstatus->value.sig = TARGET_SIGNAL_UNKNOWN;
+	      break;
+	    }
+	}
   exception_count++;
   last_sig = ourstatus->value.sig;
   return 1;
@@ -1172,6 +1203,7 @@
   thread_info *th = NULL;
   static thread_info dummy_thread_info;
   int retval = 0;
 
   last_sig = TARGET_SIGNAL_0;
 
@@ -1286,6 +1318,7 @@
 		     "EXCEPTION_DEBUG_EVENT"));
       if (saw_create != 1)
 	break;
+	  continue_status=DBG_EXCEPTION_NOT_HANDLED ;
       if (handle_exception (ourstatus))
 	retval = current_event.dwThreadId;
       break;
@@ -1972,6 +2005,12 @@
   add_show_from_set (add_set_cmd ("debugexceptions", class_support, var_boolean,
 				  (char *) &debug_exceptions,
 	       "Set whether to display kernel exceptions in child process.",
+				  &setlist),
+		     &showlist);
+		     
+  add_show_from_set (add_set_cmd ("mapexceptionstosignals", class_support, var_boolean,
+				  (char *) &mapexceptionstosignals,
+	       "Set whether to convert WIN32 exceptions to gdb signals.",
 				  &setlist),
 		     &showlist);