From bce7165daae97585d93ac28361576feebcc80721 Mon Sep 17 00:00:00 2001 From: Pedro Alves Date: Tue, 27 Mar 2007 22:46:08 +0000 Subject: [PATCH] * 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. --- gdb/gdbserver/ChangeLog | 9 +++++++ gdb/gdbserver/remote-utils.c | 2 +- gdb/gdbserver/server.h | 2 +- gdb/gdbserver/win32-i386-low.c | 43 ++++++++++++++++++++++++++++++++++ 4 files changed, 54 insertions(+), 2 deletions(-) diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog index 7385a20130d..eed968d7627 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -1,3 +1,12 @@ +2007-03-27 Pedro Alves + + * 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 * server.c (main): Correct strtoul check. diff --git a/gdb/gdbserver/remote-utils.c b/gdb/gdbserver/remote-utils.c index b9a0733067b..362bfdbc5ba 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 462bd682bb8..df676158817 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 b06a31cfe4d..655da86d7a8 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: -- 2.30.2