diff options
author | Hannes Domani <ssbssa@yahoo.de> | 2020-09-17 19:10:16 +0200 |
---|---|---|
committer | Hannes Domani <ssbssa@yahoo.de> | 2020-09-17 22:17:01 +0200 |
commit | 0363df3db7d3f5edd3a349ab7720eca83f460545 (patch) | |
tree | 89f6088ae55e7ebe92b245499de33f3cf4fd6543 | |
parent | 280a9412e483c0e4d253a338477a602cffba058c (diff) | |
download | fsf-binutils-gdb-0363df3db7d3f5edd3a349ab7720eca83f460545.zip fsf-binutils-gdb-0363df3db7d3f5edd3a349ab7720eca83f460545.tar.gz fsf-binutils-gdb-0363df3db7d3f5edd3a349ab7720eca83f460545.tar.bz2 |
Fix ctrl-c when debugging WOW64 processes
DebugBreakProcess starts a new thread in the target process with the
entry point DbgUiRemoteBreakin, where an int3 triggers a breakpoint
exception for gdb.
But this uses DbgUiRemoteBreakin of the 64bit ntdll.dll even for
WOW64 processes.
It stops in 64bit code, Wow64GetThreadContext reports a wrong pc without
the int3, and gdb lets the target process continue.
So this uses DbgUiRemoteBreakin of the 32bit ntdll.dll as the thread
entry point for WOW64 processes instead.
gdb/ChangeLog:
2020-09-17 Hannes Domani <ssbssa@yahoo.de>
* windows-nat.c (ctrl_c_handler): Use 32bit DbgUiRemoteBreakin
for WOW64 processes.
-rw-r--r-- | gdb/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/windows-nat.c | 35 |
2 files changed, 37 insertions, 3 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 3c8e4a1..4b54f4e 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2020-09-17 Hannes Domani <ssbssa@yahoo.de> + + * windows-nat.c (ctrl_c_handler): Use 32bit DbgUiRemoteBreakin + for WOW64 processes. + 2020-09-17 Tom Tromey <tom@tromey.com> * dwarf2/read.c (compute_compunit_symtab_includes): Use htab_up. diff --git a/gdb/windows-nat.c b/gdb/windows-nat.c index 188a920..ec5e428 100644 --- a/gdb/windows-nat.c +++ b/gdb/windows-nat.c @@ -71,6 +71,7 @@ #include "gdbsupport/pathstuff.h" #include "gdbsupport/gdb_wait.h" #include "nat/windows-nat.h" +#include "gdbsupport/symbol.h" using namespace windows_nat; @@ -235,6 +236,7 @@ static int saw_create; static int open_process_used = 0; #ifdef __x86_64__ static bool wow64_process = false; +static void *wow64_dbgbreak; #endif /* User options. */ @@ -1522,9 +1524,36 @@ ctrl_c_handler (DWORD event_type) if (!new_console && !attach_flag) return TRUE; - if (!DebugBreakProcess (current_process_handle)) - warning (_("Could not interrupt program. " - "Press Ctrl-c in the program console.")); +#ifdef __x86_64__ + if (wow64_process) + { + /* Call DbgUiRemoteBreakin of the 32bit ntdll.dll in the target process. + DebugBreakProcess would call the one of the 64bit ntdll.dll, which + can't be correctly handled by gdb. */ + if (wow64_dbgbreak == nullptr) + { + CORE_ADDR addr; + if (!find_minimal_symbol_address ("ntdll!DbgUiRemoteBreakin", + &addr, 0)) + wow64_dbgbreak = (void *) addr; + } + + if (wow64_dbgbreak != nullptr) + { + HANDLE thread = CreateRemoteThread (current_process_handle, NULL, + 0, (LPTHREAD_START_ROUTINE) + wow64_dbgbreak, NULL, 0, NULL); + if (thread) + CloseHandle (thread); + } + } + else +#endif + { + if (!DebugBreakProcess (current_process_handle)) + warning (_("Could not interrupt program. " + "Press Ctrl-c in the program console.")); + } /* Return true to tell that Ctrl-C has been handled. */ return TRUE; |