From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 9295 invoked by alias); 29 Sep 2003 15:40:19 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 9249 invoked from network); 29 Sep 2003 15:40:17 -0000 Received: from unknown (HELO web.sageconspiracy.com) (216.127.66.48) by sources.redhat.com with SMTP; 29 Sep 2003 15:40:17 -0000 X-ClientAddr: 68.96.25.175 Received: from JBETTIS (wsip-68-96-25-175.om.om.cox.net [68.96.25.175]) (authenticated (0 bits)) by web.sageconspiracy.com (8.11.6/8.11.6) with ESMTP id h8TFbug20915 for ; Mon, 29 Sep 2003 10:38:00 -0500 Message-ID: <06f801c386a0$200cb960$966fa8c0@hksys.com> From: "Jeremy Bettis" To: Subject: gdb patch take 6 Date: Mon, 29 Sep 2003 15:40:00 -0000 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_06F1_01C38676.2F1CDEF0" X-Priority: 3 X-MSMail-Priority: Normal X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1165 X-MailScanner-Information: Please contact the ISP for more information X-MailScanner: Found to be clean X-MailScanner-SpamCheck: not spam, SpamAssassin (timed out) X-SW-Source: 2003-09/txt/msg00626.txt.bz2 This is a multi-part message in MIME format. ------=_NextPart_000_06F1_01C38676.2F1CDEF0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Content-length: 494 * gdb/win32-nat.c (handle_exception,get_child_debug_event,_initialize_inftarg) 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. This patch is relative to gdb-5.2.1-1 from mingw.org. ------=_NextPart_000_06F1_01C38676.2F1CDEF0 Content-Type: text/plain; name="gdbpatch.txt" Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment; filename="gdbpatch.txt" Content-length: 9759 --- gdb-5.2.1/gdb/win32-nat.c Sun Feb 16 16:03:19 2003 +++ gdb-mine/gdb/win32-nat.c Mon Sep 15 09:57:48 2003 @@ -200,6 +200,7 @@ static int debug_events =3D 0; /* show ev static int debug_memory =3D 0; /* show target memory accesses */ static int debug_exceptions =3D 0; /* show target exceptions */ static int useshell =3D 0; /* use shell for subprocesses */ +static int mapexceptionstosignals =3D 1; /* map exceptionstosignals */ =20 /* This vector maps GDB's idea of a register's number into an address in the win32 exception context vector. @@ -1024,93 +1025,126 @@ handle_exception (struct target_waitstat /* Record the context of the current thread */ th =3D thread_rec (current_event.dwThreadId, -1); =20 - switch (code) + if (mapexceptionstosignals) { - case EXCEPTION_ACCESS_VIOLATION: - DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_ACCESS_VIOLATION"); - ourstatus->value.sig =3D TARGET_SIGNAL_SEGV; - break; - case STATUS_STACK_OVERFLOW: - DEBUG_EXCEPTION_SIMPLE ("STATUS_STACK_OVERFLOW"); - ourstatus->value.sig =3D TARGET_SIGNAL_SEGV; - break; - case STATUS_FLOAT_DENORMAL_OPERAND: - DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_DENORMAL_OPERAND"); - ourstatus->value.sig =3D TARGET_SIGNAL_FPE; - break; - case EXCEPTION_ARRAY_BOUNDS_EXCEEDED: - DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_ARRAY_BOUNDS_EXCEEDED"); - ourstatus->value.sig =3D TARGET_SIGNAL_FPE; - break; - case STATUS_FLOAT_INEXACT_RESULT: - DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_INEXACT_RESULT"); - ourstatus->value.sig =3D TARGET_SIGNAL_FPE; - break; - case STATUS_FLOAT_INVALID_OPERATION: - DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_INVALID_OPERATION"); - ourstatus->value.sig =3D TARGET_SIGNAL_FPE; - break; - case STATUS_FLOAT_OVERFLOW: - DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_OVERFLOW"); - ourstatus->value.sig =3D TARGET_SIGNAL_FPE; - break; - case STATUS_FLOAT_STACK_CHECK: - DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_STACK_CHECK"); - ourstatus->value.sig =3D TARGET_SIGNAL_FPE; - break; - case STATUS_FLOAT_UNDERFLOW: - DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_UNDERFLOW"); - ourstatus->value.sig =3D TARGET_SIGNAL_FPE; - break; - case STATUS_FLOAT_DIVIDE_BY_ZERO: - DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_DIVIDE_BY_ZERO"); - ourstatus->value.sig =3D TARGET_SIGNAL_FPE; - break; - case STATUS_INTEGER_DIVIDE_BY_ZERO: - DEBUG_EXCEPTION_SIMPLE ("STATUS_INTEGER_DIVIDE_BY_ZERO"); - ourstatus->value.sig =3D TARGET_SIGNAL_FPE; - break; - case STATUS_INTEGER_OVERFLOW: - DEBUG_EXCEPTION_SIMPLE ("STATUS_INTEGER_OVERFLOW"); - ourstatus->value.sig =3D TARGET_SIGNAL_FPE; - break; - case EXCEPTION_BREAKPOINT: - DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_BREAKPOINT"); - ourstatus->value.sig =3D TARGET_SIGNAL_TRAP; - break; - case DBG_CONTROL_C: - DEBUG_EXCEPTION_SIMPLE ("DBG_CONTROL_C"); - ourstatus->value.sig =3D TARGET_SIGNAL_INT; - break; - case DBG_CONTROL_BREAK: - DEBUG_EXCEPTION_SIMPLE ("DBG_CONTROL_BREAK"); - ourstatus->value.sig =3D TARGET_SIGNAL_INT; - break; - case EXCEPTION_SINGLE_STEP: - DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_SINGLE_STEP"); - ourstatus->value.sig =3D TARGET_SIGNAL_TRAP; - break; - case EXCEPTION_ILLEGAL_INSTRUCTION: - DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_ILLEGAL_INSTRUCTION"); - ourstatus->value.sig =3D TARGET_SIGNAL_ILL; - break; - case EXCEPTION_PRIV_INSTRUCTION: - DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_PRIV_INSTRUCTION"); - ourstatus->value.sig =3D TARGET_SIGNAL_ILL; - break; - case EXCEPTION_NONCONTINUABLE_EXCEPTION: - DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_NONCONTINUABLE_EXCEPTION"); - ourstatus->value.sig =3D 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 =3D TARGET_SIGNAL_UNKNOWN; - break; - } + switch (code) + { + case EXCEPTION_ACCESS_VIOLATION: + DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_ACCESS_VIOLATION"); + ourstatus->value.sig =3D TARGET_SIGNAL_SEGV; + break; + case STATUS_STACK_OVERFLOW: + DEBUG_EXCEPTION_SIMPLE ("STATUS_STACK_OVERFLOW"); + ourstatus->value.sig =3D TARGET_SIGNAL_SEGV; + break; + case STATUS_FLOAT_DENORMAL_OPERAND: + DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_DENORMAL_OPERAND"); + ourstatus->value.sig =3D TARGET_SIGNAL_FPE; + break; + case EXCEPTION_ARRAY_BOUNDS_EXCEEDED: + DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_ARRAY_BOUNDS_EXCEEDED"); + ourstatus->value.sig =3D TARGET_SIGNAL_FPE; + break; + case STATUS_FLOAT_INEXACT_RESULT: + DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_INEXACT_RESULT"); + ourstatus->value.sig =3D TARGET_SIGNAL_FPE; + break; + case STATUS_FLOAT_INVALID_OPERATION: + DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_INVALID_OPERATION"); + ourstatus->value.sig =3D TARGET_SIGNAL_FPE; + break; + case STATUS_FLOAT_OVERFLOW: + DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_OVERFLOW"); + ourstatus->value.sig =3D TARGET_SIGNAL_FPE; + break; + case STATUS_FLOAT_STACK_CHECK: + DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_STACK_CHECK"); + ourstatus->value.sig =3D TARGET_SIGNAL_FPE; + break; + case STATUS_FLOAT_UNDERFLOW: + DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_UNDERFLOW"); + ourstatus->value.sig =3D TARGET_SIGNAL_FPE; + break; + case STATUS_FLOAT_DIVIDE_BY_ZERO: + DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_DIVIDE_BY_ZERO"); + ourstatus->value.sig =3D TARGET_SIGNAL_FPE; + break; + case STATUS_INTEGER_DIVIDE_BY_ZERO: + DEBUG_EXCEPTION_SIMPLE ("STATUS_INTEGER_DIVIDE_BY_ZERO"); + ourstatus->value.sig =3D TARGET_SIGNAL_FPE; + break; + case STATUS_INTEGER_OVERFLOW: + DEBUG_EXCEPTION_SIMPLE ("STATUS_INTEGER_OVERFLOW"); + ourstatus->value.sig =3D TARGET_SIGNAL_FPE; + break; + case EXCEPTION_BREAKPOINT: + DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_BREAKPOINT"); + ourstatus->value.sig =3D TARGET_SIGNAL_TRAP; + break; + case DBG_CONTROL_C: + DEBUG_EXCEPTION_SIMPLE ("DBG_CONTROL_C"); + ourstatus->value.sig =3D TARGET_SIGNAL_INT; + break; + case DBG_CONTROL_BREAK: + DEBUG_EXCEPTION_SIMPLE ("DBG_CONTROL_BREAK"); + ourstatus->value.sig =3D TARGET_SIGNAL_INT; + break; + case EXCEPTION_SINGLE_STEP: + DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_SINGLE_STEP"); + ourstatus->value.sig =3D TARGET_SIGNAL_TRAP; + break; + case EXCEPTION_ILLEGAL_INSTRUCTION: + DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_ILLEGAL_INSTRUCTION"); + ourstatus->value.sig =3D TARGET_SIGNAL_ILL; + break; + case EXCEPTION_PRIV_INSTRUCTION: + DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_PRIV_INSTRUCTION"); + ourstatus->value.sig =3D TARGET_SIGNAL_ILL; + break; + case EXCEPTION_NONCONTINUABLE_EXCEPTION: + DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_NONCONTINUABLE_EXCEPTION"); + ourstatus->value.sig =3D TARGET_SIGNAL_ILL; + break; + default: + if (current_event.u.Exception.dwFirstChance) + return 0; + printf_unfiltered ("gdb: unknown target exception 0x%08lx at 0x%08l= x\n", + current_event.u.Exception.ExceptionRecord.ExceptionCode, + (DWORD) current_event.u.Exception.ExceptionRecord.ExceptionAddress); + ourstatus->value.sig =3D TARGET_SIGNAL_UNKNOWN; + break; + } + } + else + { + switch (code) + { + case EXCEPTION_BREAKPOINT: + DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_BREAKPOINT"); + ourstatus->value.sig =3D TARGET_SIGNAL_TRAP; + break; + case DBG_CONTROL_C: + DEBUG_EXCEPTION_SIMPLE ("DBG_CONTROL_C"); + ourstatus->value.sig =3D TARGET_SIGNAL_INT; + break; + case DBG_CONTROL_BREAK: + DEBUG_EXCEPTION_SIMPLE ("DBG_CONTROL_BREAK"); + ourstatus->value.sig =3D TARGET_SIGNAL_INT; + break; + case EXCEPTION_SINGLE_STEP: + DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_SINGLE_STEP"); + ourstatus->value.sig =3D TARGET_SIGNAL_TRAP; + break; + default: + if (current_event.u.Exception.dwFirstChance) + return 0; + printf_unfiltered ("gdb: unknown target exception 0x%08lx at 0x%08l= x\n", + current_event.u.Exception.ExceptionRecord.ExceptionCode, + (DWORD) current_event.u.Exception.ExceptionRecord.ExceptionAddress); + ourstatus->value.sig =3D TARGET_SIGNAL_UNKNOWN; + break; + } + } exception_count++; last_sig =3D ourstatus->value.sig; return 1; @@ -1286,6 +1320,7 @@ get_child_debug_event (int pid, struct t "EXCEPTION_DEBUG_EVENT")); if (saw_create !=3D 1) break; + continue_status=3DDBG_EXCEPTION_NOT_HANDLED; if (handle_exception (ourstatus)) retval =3D current_event.dwThreadId; break; @@ -1972,6 +2007,12 @@ _initialize_inftarg (void) add_show_from_set (add_set_cmd ("debugexceptions", class_support, var_bo= olean, (char *) &debug_exceptions, "Set whether to display kernel exceptions in child process.", + &setlist), + &showlist); +=09=09=20=20=20=20=20 + 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); =20 ------=_NextPart_000_06F1_01C38676.2F1CDEF0--