mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-08-06 14:49:38 +08:00
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:
@ -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:
|
||||
|
Reference in New Issue
Block a user