This is the mail archive of the gdb-patches@sourceware.org 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]
Other format: [Raw text]

Re: Patch : gdbserver get_image_name on CE


On Wednesday 01 July 2009 21:13:05, Pedro Alves wrote:
> I'll see about cleaning up the bits of your patch that are OK and
> apply them (you still aren't following the code conventions). ?Then
> we can focus on just this bit.

I've checked in the patch below, after giving it a testsuite
run against a local Cygwin gdbserver without regressions.

-- 
Pedro Alves

2009-07-04  Danny Backx  <dannybackx@users.sourceforge.net>
	    Pedro Alves  <pedro@codesourcery.com>

	* win32-i386-low.c (i386_get_thread_context): Handle systems that
	don't support CONTEXT_EXTENDED_REGISTERS.
	(i386_win32_breakpoint, i386_win32_breakpoint_len): New.
	(the_low_target): Install them.
	* win32-low.c (get_child_debug_event): Handle WaitForDebugEvent
	failing with ERROR_PIPE_NOT_CONNECTED.

---
 gdb/gdbserver/win32-i386-low.c |   34 ++++++++++++++++++++++++++--------
 gdb/gdbserver/win32-low.c      |   17 ++++++++++++++++-
 2 files changed, 42 insertions(+), 9 deletions(-)

Index: src/gdb/gdbserver/win32-i386-low.c
===================================================================
--- src.orig/gdb/gdbserver/win32-i386-low.c	2009-07-04 17:39:07.046875000 +0100
+++ src/gdb/gdbserver/win32-i386-low.c	2009-07-04 19:11:08.375000000 +0100
@@ -129,13 +129,28 @@
 static void
 i386_get_thread_context (win32_thread_info *th, DEBUG_EVENT* current_event)
 {
-  th->context.ContextFlags = \
-    CONTEXT_FULL | \
-    CONTEXT_FLOATING_POINT | \
-    CONTEXT_EXTENDED_REGISTERS | \
-    CONTEXT_DEBUG_REGISTERS;
+  /* Requesting the CONTEXT_EXTENDED_REGISTERS register set fails if
+     the system doesn't support extended registers.  */
+  static DWORD extended_registers = CONTEXT_EXTENDED_REGISTERS;
+
+ again:
+  th->context.ContextFlags = (CONTEXT_FULL
+			      | CONTEXT_FLOATING_POINT
+			      | CONTEXT_DEBUG_REGISTERS
+			      | extended_registers);
 
-  GetThreadContext (th->h, &th->context);
+  if (!GetThreadContext (th->h, &th->context))
+    {
+      DWORD e = GetLastError ();
+
+      if (extended_registers && e == ERROR_INVALID_PARAMETER)
+	{
+	  extended_registers = 0;
+	  goto again;
+	}
+
+      error ("GetThreadContext failure %ld\n", (long) e);
+    }
 
   debug_registers_changed = 0;
 
@@ -283,6 +298,9 @@
   collect_register (r, context_offset);
 }
 
+static const unsigned char i386_win32_breakpoint = 0xcc;
+#define i386_win32_breakpoint_len 1
+
 struct win32_target_ops the_low_target = {
   init_registers_i386,
   sizeof (mappings) / sizeof (mappings[0]),
@@ -293,8 +311,8 @@
   i386_fetch_inferior_register,
   i386_store_inferior_register,
   i386_single_step,
-  NULL, /* breakpoint */
-  0, /* breakpoint_len */
+  &i386_win32_breakpoint,
+  i386_win32_breakpoint_len,
   i386_insert_point,
   i386_remove_point,
   i386_stopped_by_watchpoint,
Index: src/gdb/gdbserver/win32-low.c
===================================================================
--- src.orig/gdb/gdbserver/win32-low.c	2009-07-04 17:39:07.092875000 +0100
+++ src/gdb/gdbserver/win32-low.c	2009-07-04 19:00:07.750000000 +0100
@@ -1407,7 +1407,22 @@
 	 interruption, but high enough so gdbserver doesn't become a
 	 bottleneck.  */
       if (!WaitForDebugEvent (&current_event, 250))
-	return 0;
+        {
+	  DWORD e  = GetLastError();
+
+	  if (e == ERROR_PIPE_NOT_CONNECTED)
+	    {
+	      /* This will happen if the loader fails to succesfully
+		 load the application, e.g., if the main executable
+		 tries to pull in a non-existing export from a
+		 DLL.  */
+	      ourstatus->kind = TARGET_WAITKIND_EXITED;
+	      ourstatus->value.integer = 1;
+	      return 1;
+	    }
+
+	  return 0;
+        }
     }
 
  gotevent:


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