* win32-nat.c (handle_exception): Treat win32 routines which check for valid
authorChristopher Faylor <me+cygwin@cgf.cx>
Sun, 27 Mar 2005 05:21:12 +0000 (05:21 +0000)
committerChristopher Faylor <me+cygwin@cgf.cx>
Sun, 27 Mar 2005 05:21:12 +0000 (05:21 +0000)
addresses as "special" and don't stop when a SEGV is detected.
(get_child_debug_event): Properly flag exception as unhandled.

gdb/ChangeLog
gdb/win32-nat.c
gdb/windows-nat.c

index d8ebcbd..eb3faee 100644 (file)
@@ -1,3 +1,9 @@
+2005-03-27  Christopher Faylor  <cgf@timesys.com>
+
+       * win32-nat.c (handle_exception): Treat win32 routines which check for
+       valid addresses as "special" and don't stop when a SEGV is detected.
+       (get_child_debug_event): Properly flag exception as unhandled.
+
 2005-03-26  Daniel Jacobowitz  <dan@codesourcery.com>
 
        * cp-support.c (cp_class_name_from_physname): Rewrite.
index fb6b611..bfdf9dc 100644 (file)
@@ -1077,6 +1077,14 @@ handle_exception (struct target_waitstatus *ourstatus)
     case EXCEPTION_ACCESS_VIOLATION:
       DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_ACCESS_VIOLATION");
       ourstatus->value.sig = TARGET_SIGNAL_SEGV;
+      {
+       char *fn;
+       if (find_pc_partial_function ((CORE_ADDR) current_event.u.Exception
+                                     .ExceptionRecord.ExceptionAddress,
+                                     &fn, NULL, NULL)
+           && strncmp (fn, "KERNEL32!IsBad", strlen ("KERNEL32!IsBad")) == 0)
+         return 0;
+      }
       break;
     case STATUS_STACK_OVERFLOW:
       DEBUG_EXCEPTION_SIMPLE ("STATUS_STACK_OVERFLOW");
@@ -1360,6 +1368,8 @@ get_child_debug_event (int pid, struct target_waitstatus *ourstatus)
        break;
       if (handle_exception (ourstatus))
        retval = current_event.dwThreadId;
+      else
+       continue_status = DBG_EXCEPTION_NOT_HANDLED;
       break;
 
     case OUTPUT_DEBUG_STRING_EVENT:    /* message from the kernel */
index fb6b611..bfdf9dc 100644 (file)
@@ -1077,6 +1077,14 @@ handle_exception (struct target_waitstatus *ourstatus)
     case EXCEPTION_ACCESS_VIOLATION:
       DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_ACCESS_VIOLATION");
       ourstatus->value.sig = TARGET_SIGNAL_SEGV;
+      {
+       char *fn;
+       if (find_pc_partial_function ((CORE_ADDR) current_event.u.Exception
+                                     .ExceptionRecord.ExceptionAddress,
+                                     &fn, NULL, NULL)
+           && strncmp (fn, "KERNEL32!IsBad", strlen ("KERNEL32!IsBad")) == 0)
+         return 0;
+      }
       break;
     case STATUS_STACK_OVERFLOW:
       DEBUG_EXCEPTION_SIMPLE ("STATUS_STACK_OVERFLOW");
@@ -1360,6 +1368,8 @@ get_child_debug_event (int pid, struct target_waitstatus *ourstatus)
        break;
       if (handle_exception (ourstatus))
        retval = current_event.dwThreadId;
+      else
+       continue_status = DBG_EXCEPTION_NOT_HANDLED;
       break;
 
     case OUTPUT_DEBUG_STRING_EVENT:    /* message from the kernel */