Re: gdb exceptions patch
Earnie Boyd <[email protected]> Tue, 09 Sep 2003 18:37:26 -0400
| Newsgroups | gmane.comp.gnu.mingw.patches |
|---|---|
| Message-ID | <[email protected]> |
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