This is the mail archive of the gdb-patches@sourceware.cygnus.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

[PATCH] revert win32-nat.c stack handling to working version


I added some "functionality" to win32-nat.c a while ago while under the
mistaken impression that using the Microsoft stack-walking APIs would
somehow provide more functionality than what was previously available in
gdb.  Instead, I just broke things so that stack walking stopped after a
few frames.

The enclosed patch reverts gdb to its previous behavior and also adds an
additional unrelated trap for illegal instructions, which was missing
before (I know this should be a separate patch but...).

I did not run this through the testsuite because bfd seems to still
be badly broken on sourceware so I know that most of the tests would
fail.  I did verify that the gdb 'bt' command now displays correct
information, however.

cgf

Index: win32-nat.c
===================================================================
RCS file: /cvs/src/src/gdb/win32-nat.c,v
retrieving revision 1.4
diff -u -p -r1.4 win32-nat.c
--- win32-nat.c	2000/02/28 06:43:20	1.4
+++ win32-nat.c	2000/03/25 02:23:28
@@ -601,6 +601,11 @@ handle_exception (struct target_waitstat
 	       current_event.u.Exception.ExceptionRecord.ExceptionAddress));
       ourstatus->value.sig = TARGET_SIGNAL_TRAP;
       break;
+    case EXCEPTION_ILLEGAL_INSTRUCTION:
+      DEBUG_EXCEPT (("gdb: Target exception SINGLE_ILL at 0x%08x\n",
+	       current_event.u.Exception.ExceptionRecord.ExceptionAddress));
+      ourstatus->value.sig = TARGET_SIGNAL_ILL;
+      break;
     default:
       /* This may be a structured exception handling exception.  In
          that case, we want to let the program try to handle it, and
@@ -1272,61 +1277,4 @@ cygwin_pid_to_str (int pid)
   else
     sprintf (buf, "thread %d.0x%x", current_event.dwProcessId, pid);
   return buf;
-}
-
-static LPVOID __stdcall
-sfta(HANDLE h, DWORD d)
-{
-  return NULL;
-}
-
-static DWORD __stdcall
-sgmb(HANDLE h, DWORD d)
-{
-#if 0
-  return 4;
-#else
-  return SymGetModuleBase (h, d) ?: 4;
-#endif
-}
-
-CORE_ADDR
-child_frame_chain(struct frame_info *f)
-{
-  STACKFRAME *sf = (STACKFRAME *) f->extra_info;
-  if (!StackWalk (IMAGE_FILE_MACHINE_I386, current_process_handle,
-		  current_thread->h, sf, NULL, NULL, SymFunctionTableAccess, sgmb, NULL) ||
-      !sf->AddrReturn.Offset)
-    return 0;
-  return sf->AddrFrame.Offset;
-}
-
-CORE_ADDR
-child_frame_saved_pc(struct frame_info *f)
-{
-  STACKFRAME *sf = (STACKFRAME *) f->extra_info;
-  return sf->AddrReturn.Offset;
-}
-
-void
-child_init_frame(int leaf, struct frame_info *f)
-{
-  STACKFRAME *sf;
-
-  if (f->next && f->next->extra_info)
-    f->extra_info = f->next->extra_info;
-  else if (f->prev && f->prev->extra_info)
-    f->extra_info = f->prev->extra_info;
-  else
-    {
-      sf = (STACKFRAME *) frame_obstack_alloc (sizeof (*sf));
-      f->extra_info = (struct frame_extra_info *) sf;
-      memset (sf, 0, sizeof(*sf));
-      sf->AddrPC.Offset = f->pc;
-      sf->AddrPC.Mode = AddrModeFlat;
-      sf->AddrStack.Offset = current_thread->context.Esp;
-      sf->AddrStack.Mode = AddrModeFlat;
-      sf->AddrFrame.Offset = f->frame;
-      sf->AddrFrame.Mode = AddrModeFlat;
-    }
 }
Index: config/i386/tm-cygwin.h
===================================================================
RCS file: /cvs/src/src/gdb/config/i386/tm-cygwin.h,v
retrieving revision 1.1.1.5
diff -u -p -r1.1.1.5 tm-cygwin.h
--- tm-cygwin.h	1999/12/22 21:45:13	1.1.1.5
+++ tm-cygwin.h	2000/03/25 02:23:28
@@ -1,5 +1,5 @@
 /* Macro definitions for i386 running under the win32 API Unix.
-   Copyright 1995 - 1999 Free Software Foundation, Inc.
+   Copyright 1995, 1996, 1997, 1998, 1999, 2000 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -29,20 +29,3 @@
 extern CORE_ADDR skip_trampoline_code PARAMS ((CORE_ADDR pc, char *name));
 
 extern char *cygwin_pid_to_str PARAMS ((int pid));
-
-struct frame_info;
-void child_init_frame(int x, struct frame_info *);
-CORE_ADDR child_frame_saved_pc(struct frame_info *);
-CORE_ADDR child_frame_chain(struct frame_info *);
-
-#undef FRAME_CHAIN_VALID_ALTERNATE
-#define FRAME_CHAIN_VALID_ALTERNATE 1
-
-#undef INIT_EXTRA_FRAME_INFO
-#define INIT_EXTRA_FRAME_INFO(x, f) child_init_frame(x, f) 
-
-#undef FRAME_CHAIN
-#define FRAME_CHAIN child_frame_chain
-
-#undef FRAME_SAVED_PC
-#define FRAME_SAVED_PC child_frame_saved_pc

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]