Fix debugging of WOW64 processes

The new code regarding pending stops only checks for EXCEPTION_BREAKPOINT,
but for WOW64 processes STATUS_WX86_BREAKPOINT is necessary as well.

Also, ignore_first_breakpoint is used now in nat/windows-nat.c as well,
but was not available there.

gdb/ChangeLog:

2020-04-10  Hannes Domani  <ssbssa@yahoo.de>

	* nat/windows-nat.c (STATUS_WX86_BREAKPOINT, STATUS_WX86_SINGLE_STEP):
	Move to...
	* nat/windows-nat.h (STATUS_WX86_BREAKPOINT, STATUS_WX86_SINGLE_STEP):
	... here.
	* windows-nat.c (windows_nat_target::get_windows_debug_event):
	Check for STATUS_WX86_BREAKPOINT.
	(windows_nat_target::wait): Same.
This commit is contained in:
Hannes Domani 2020-04-09 16:33:20 +02:00
parent a5d214978f
commit 13302e956f
4 changed files with 30 additions and 8 deletions

View File

@ -1,3 +1,13 @@
2020-04-10 Hannes Domani <ssbssa@yahoo.de>
* nat/windows-nat.c (STATUS_WX86_BREAKPOINT, STATUS_WX86_SINGLE_STEP):
Move to...
* nat/windows-nat.h (STATUS_WX86_BREAKPOINT, STATUS_WX86_SINGLE_STEP):
... here.
* windows-nat.c (windows_nat_target::get_windows_debug_event):
Check for STATUS_WX86_BREAKPOINT.
(windows_nat_target::wait): Same.
2020-04-10 Tom de Vries <tdevries@suse.de> 2020-04-10 Tom de Vries <tdevries@suse.de>
PR cli/25808 PR cli/25808

View File

@ -20,9 +20,6 @@
#include "nat/windows-nat.h" #include "nat/windows-nat.h"
#include "gdbsupport/common-debug.h" #include "gdbsupport/common-debug.h"
#define STATUS_WX86_BREAKPOINT 0x4000001F
#define STATUS_WX86_SINGLE_STEP 0x4000001E
namespace windows_nat namespace windows_nat
{ {
@ -44,6 +41,10 @@ DWORD desired_stop_thread_id = -1;
std::vector<pending_stop> pending_stops; std::vector<pending_stop> pending_stops;
EXCEPTION_RECORD siginfo_er; EXCEPTION_RECORD siginfo_er;
#ifdef __x86_64__
bool ignore_first_breakpoint = false;
#endif
/* Note that 'debug_events' must be locally defined in the relevant /* Note that 'debug_events' must be locally defined in the relevant
functions. */ functions. */
#define DEBUG_EVENTS(x) if (debug_events) debug_printf x #define DEBUG_EVENTS(x) if (debug_events) debug_printf x

View File

@ -25,6 +25,9 @@
#include "gdbsupport/gdb_optional.h" #include "gdbsupport/gdb_optional.h"
#include "target/waitstatus.h" #include "target/waitstatus.h"
#define STATUS_WX86_BREAKPOINT 0x4000001F
#define STATUS_WX86_SINGLE_STEP 0x4000001E
namespace windows_nat namespace windows_nat
{ {
@ -202,6 +205,11 @@ extern std::vector<pending_stop> pending_stops;
/* Contents of $_siginfo */ /* Contents of $_siginfo */
extern EXCEPTION_RECORD siginfo_er; extern EXCEPTION_RECORD siginfo_er;
#ifdef __x86_64__
/* Ignore first breakpoint exception of WOW64 process */
extern bool ignore_first_breakpoint;
#endif
/* Return the name of the DLL referenced by H at ADDRESS. UNICODE /* Return the name of the DLL referenced by H at ADDRESS. UNICODE
determines what sort of string is read from the inferior. Returns determines what sort of string is read from the inferior. Returns
the name of the DLL, or NULL on error. If a name is returned, it the name of the DLL, or NULL on error. If a name is returned, it

View File

@ -235,7 +235,6 @@ static int saw_create;
static int open_process_used = 0; static int open_process_used = 0;
#ifdef __x86_64__ #ifdef __x86_64__
static bool wow64_process = false; static bool wow64_process = false;
static bool ignore_first_breakpoint = false;
#endif #endif
/* User options. */ /* User options. */
@ -1721,8 +1720,10 @@ windows_nat_target::get_windows_debug_event (int pid,
thread_id, desired_stop_thread_id)); thread_id, desired_stop_thread_id));
if (current_event.dwDebugEventCode == EXCEPTION_DEBUG_EVENT if (current_event.dwDebugEventCode == EXCEPTION_DEBUG_EVENT
&& (current_event.u.Exception.ExceptionRecord.ExceptionCode && ((current_event.u.Exception.ExceptionRecord.ExceptionCode
== EXCEPTION_BREAKPOINT) == EXCEPTION_BREAKPOINT)
|| (current_event.u.Exception.ExceptionRecord.ExceptionCode
== STATUS_WX86_BREAKPOINT))
&& windows_initialization_done) && windows_initialization_done)
{ {
ptid_t ptid = ptid_t (current_event.dwProcessId, thread_id, 0); ptid_t ptid = ptid_t (current_event.dwProcessId, thread_id, 0);
@ -1801,8 +1802,10 @@ windows_nat_target::wait (ptid_t ptid, struct target_waitstatus *ourstatus,
{ {
current_windows_thread->stopped_at_software_breakpoint = false; current_windows_thread->stopped_at_software_breakpoint = false;
if (current_event.dwDebugEventCode == EXCEPTION_DEBUG_EVENT if (current_event.dwDebugEventCode == EXCEPTION_DEBUG_EVENT
&& (current_event.u.Exception.ExceptionRecord.ExceptionCode && ((current_event.u.Exception.ExceptionRecord.ExceptionCode
== EXCEPTION_BREAKPOINT) == EXCEPTION_BREAKPOINT)
|| (current_event.u.Exception.ExceptionRecord.ExceptionCode
== STATUS_WX86_BREAKPOINT))
&& windows_initialization_done) && windows_initialization_done)
current_windows_thread->stopped_at_software_breakpoint = true; current_windows_thread->stopped_at_software_breakpoint = true;
} }