Handle 64bit breakpoints of WOW64 processes as SIGINT

When a WOW64 process triggers a breakpoint exception in 64bit code (which
happens when a 64bit gdb calls DebugBreakProcess for a 32bit target),
gdb ignores the breakpoint (because Wow64GetThreadContext can only report
the pc of 32bit code, and there is not int3 at this location).

But if these 64bit breakpoint exceptions are handled as SIGINT, gdb
doesn't check for int3, and always stops the target.

gdb/ChangeLog:

2020-09-23  Hannes Domani  <ssbssa@yahoo.de>

	* nat/windows-nat.c (handle_exception): Handle 64bit breakpoints
	in WOW64 processes as SIGINT.
	* nat/windows-nat.h: Make wow64_process a shared variable.
	* windows-nat.c: Remove static wow64_process variable.

gdbserver/ChangeLog:

2020-09-23  Hannes Domani  <ssbssa@yahoo.de>

	* win32-low.cc: Remove local wow64_process variable.
	* win32-low.h: Remove local wow64_process variable.
This commit is contained in:
Hannes Domani 2020-09-23 18:16:24 +02:00
parent 6eee0315f6
commit 99bb393f1d
7 changed files with 29 additions and 7 deletions

View File

@ -1,3 +1,10 @@
2020-09-23 Hannes Domani <ssbssa@yahoo.de>
* nat/windows-nat.c (handle_exception): Handle 64bit breakpoints
in WOW64 processes as SIGINT.
* nat/windows-nat.h: Make wow64_process a shared variable.
* windows-nat.c: Remove static wow64_process variable.
2020-09-23 Tom Tromey <tom@tromey.com>
PR symtab/25470:

View File

@ -41,6 +41,7 @@ std::vector<pending_stop> pending_stops;
EXCEPTION_RECORD siginfo_er;
#ifdef __x86_64__
bool wow64_process = false;
bool ignore_first_breakpoint = false;
#endif
@ -240,6 +241,20 @@ handle_exception (struct target_waitstatus *ourstatus, bool debug_exceptions)
ourstatus->kind = TARGET_WAITKIND_SPURIOUS;
ignore_first_breakpoint = false;
}
else if (wow64_process)
{
/* This breakpoint exception is triggered for WOW64 processes when
reaching an int3 instruction in 64bit code.
gdb checks for int3 in case of SIGTRAP, this fails because
Wow64GetThreadContext can only report the pc of 32bit code, and
gdb lets the target process continue.
So handle it as SIGINT instead, then the target is stopped
unconditionally. */
DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_BREAKPOINT");
rec->ExceptionCode = DBG_CONTROL_C;
ourstatus->value.sig = GDB_SIGNAL_INT;
break;
}
#endif
/* FALLTHROUGH */
case STATUS_WX86_BREAKPOINT:

View File

@ -215,6 +215,8 @@ extern std::vector<pending_stop> pending_stops;
extern EXCEPTION_RECORD siginfo_er;
#ifdef __x86_64__
/* The target is a WOW64 process */
extern bool wow64_process;
/* Ignore first breakpoint exception of WOW64 process */
extern bool ignore_first_breakpoint;
#endif

View File

@ -235,7 +235,6 @@ static std::vector<windows_thread_info *> thread_list;
static int saw_create;
static int open_process_used = 0;
#ifdef __x86_64__
static bool wow64_process = false;
static void *wow64_dbgbreak;
#endif

View File

@ -1,3 +1,8 @@
2020-09-23 Hannes Domani <ssbssa@yahoo.de>
* win32-low.cc: Remove local wow64_process variable.
* win32-low.h: Remove local wow64_process variable.
2020-09-18 Tom Tromey <tromey@adacore.com>
* netbsd-low.h (class netbsd_process_target) <wait>: Update.

View File

@ -91,10 +91,6 @@ static int faked_breakpoint = 0;
/* True if current_process_handle needs to be closed. */
static bool open_process_used = false;
#ifdef __x86_64__
bool wow64_process = false;
#endif
const struct target_desc *win32_tdesc;
#ifdef __x86_64__
const struct target_desc *wow64_win32_tdesc;

View File

@ -30,8 +30,6 @@ extern const struct target_desc *win32_tdesc;
#ifdef __x86_64__
extern const struct target_desc *wow64_win32_tdesc;
extern bool wow64_process;
typedef BOOL (WINAPI *winapi_Wow64GetThreadContext) (HANDLE, PWOW64_CONTEXT);
extern winapi_Wow64GetThreadContext win32_Wow64GetThreadContext;
#endif