aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/gdbserver/ChangeLog9
-rw-r--r--gdb/gdbserver/remote-utils.c2
-rw-r--r--gdb/gdbserver/server.h2
-rw-r--r--gdb/gdbserver/win32-i386-low.c43
4 files changed, 54 insertions, 2 deletions
diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog
index 7385a20..eed968d 100644
--- a/gdb/gdbserver/ChangeLog
+++ b/gdb/gdbserver/ChangeLog
@@ -1,3 +1,12 @@
+2007-03-27 Pedro Alves <pedro_alves@portugalmail.pt>
+
+ * remote-utils.c (monitor_output): Constify msg parameter.
+ * server.h (monitor_output): Likewise.
+ * win32-i386-low.c (handle_output_debug_string): New.
+ (win32_kill): Handle OUTPUT_DEBUG_STRING_EVENT events using
+ handle_output_debug_string.
+ (get_child_debug_event): Likewise.
+
2007-03-27 Mat Hostetter <mat@lcs.mit.edu>
* server.c (main): Correct strtoul check.
diff --git a/gdb/gdbserver/remote-utils.c b/gdb/gdbserver/remote-utils.c
index b9a0733..362bfdb 100644
--- a/gdb/gdbserver/remote-utils.c
+++ b/gdb/gdbserver/remote-utils.c
@@ -1087,7 +1087,7 @@ look_up_one_symbol (const char *name, CORE_ADDR *addrp)
}
void
-monitor_output (char *msg)
+monitor_output (const char *msg)
{
char *buf = malloc (strlen (msg) * 2 + 2);
diff --git a/gdb/gdbserver/server.h b/gdb/gdbserver/server.h
index 462bd68..df67615 100644
--- a/gdb/gdbserver/server.h
+++ b/gdb/gdbserver/server.h
@@ -172,7 +172,7 @@ int remote_escape_output (const gdb_byte *buffer, int len,
int look_up_one_symbol (const char *name, CORE_ADDR *addrp);
-void monitor_output (char *msg);
+void monitor_output (const char *msg);
/* Functions from ``signals.c''. */
enum target_signal target_signal_from_host (int hostsig);
diff --git a/gdb/gdbserver/win32-i386-low.c b/gdb/gdbserver/win32-i386-low.c
index b06a31c..655da86 100644
--- a/gdb/gdbserver/win32-i386-low.c
+++ b/gdb/gdbserver/win32-i386-low.c
@@ -576,6 +576,43 @@ win32_attach (unsigned long pid)
return res;
}
+/* Handle OUTPUT_DEBUG_STRING_EVENT from child process. */
+static void
+handle_output_debug_string (struct target_waitstatus *ourstatus)
+{
+#define READ_BUFFER_LEN 1024
+ CORE_ADDR addr;
+ char s[READ_BUFFER_LEN + 1] = { 0 };
+ DWORD nbytes = current_event.u.DebugString.nDebugStringLength;
+
+ if (nbytes == 0)
+ return;
+
+ if (nbytes > READ_BUFFER_LEN)
+ nbytes = READ_BUFFER_LEN;
+
+ addr = (CORE_ADDR) (size_t) current_event.u.DebugString.lpDebugStringData;
+
+ if (current_event.u.DebugString.fUnicode)
+ {
+ /* The event tells us how many bytes, not chars, even
+ in Unicode. */
+ WCHAR buffer[(READ_BUFFER_LEN + 1) / sizeof (WCHAR)] = { 0 };
+ if (read_inferior_memory (addr, (unsigned char *) buffer, nbytes) != 0)
+ return;
+ wcstombs (s, buffer, (nbytes + 1) / sizeof (WCHAR));
+ }
+ else
+ {
+ if (read_inferior_memory (addr, (unsigned char *) s, nbytes) != 0)
+ return;
+ }
+
+ if (strncmp (s, "cYg", 3) != 0)
+ monitor_output (s);
+#undef READ_BUFFER_LEN
+}
+
/* Kill all inferiors. */
static void
win32_kill (void)
@@ -592,6 +629,11 @@ win32_kill (void)
break;
if (current_event.dwDebugEventCode == EXIT_PROCESS_DEBUG_EVENT)
break;
+ else if (current_event.dwDebugEventCode == OUTPUT_DEBUG_STRING_EVENT)
+ {
+ struct target_waitstatus our_status = { 0 };
+ handle_output_debug_string (&our_status);
+ }
}
}
@@ -939,6 +981,7 @@ in:
"for pid=%d tid=%x\n",
(unsigned) current_event.dwProcessId,
(unsigned) current_event.dwThreadId));
+ handle_output_debug_string (ourstatus);
break;
default: