Fix Windows debugging regression
The updated pending stop series introduced a regression in Windows debugging. When stopped at a software breakpoint, we would adjust the PC each time it was requested -- however, more than a single adjustment is incorrect. This patch introduces a new flag that is used to ensure the adjustment only happens a single time. No similar change is needed in gdbserver, because it adjusts the PC in a different way. I still can't run the gdb test suite on Windows, but I can run the internal AdaCore test suite there; and this fixes the regressions there. gdb/ChangeLog 2020-04-24 Tom Tromey <tromey@adacore.com> * nat/windows-nat.h (struct windows_thread_info) <pc_adjusted>: New member. * windows-nat.c (windows_fetch_one_register): Check pc_adjusted. (windows_nat_target::get_windows_debug_event) (windows_nat_target::wait): Set pc_adjusted.
This commit is contained in:
parent
884287754e
commit
7be2bb4f47
@ -1,3 +1,12 @@
|
||||
2020-04-24 Tom Tromey <tromey@adacore.com>
|
||||
|
||||
* nat/windows-nat.h (struct windows_thread_info)
|
||||
<pc_adjusted>: New member.
|
||||
* windows-nat.c (windows_fetch_one_register): Check
|
||||
pc_adjusted.
|
||||
(windows_nat_target::get_windows_debug_event)
|
||||
(windows_nat_target::wait): Set pc_adjusted.
|
||||
|
||||
2020-04-24 Tom de Vries <tdevries@suse.de>
|
||||
|
||||
* contrib/cc-with-tweaks.sh: Remove <exec>.gdb-index file handling.
|
||||
|
@ -93,6 +93,11 @@ struct windows_thread_info
|
||||
breakpoint. This is used to offset the PC when needed. */
|
||||
bool stopped_at_software_breakpoint = false;
|
||||
|
||||
/* True if we've adjusted the PC after hitting a software
|
||||
breakpoint, false otherwise. This lets us avoid multiple
|
||||
adjustments if the registers are read multiple times. */
|
||||
bool pc_adjusted = false;
|
||||
|
||||
/* The name of the thread, allocated by xmalloc. */
|
||||
gdb::unique_xmalloc_ptr<char> name;
|
||||
};
|
||||
|
@ -604,6 +604,7 @@ windows_fetch_one_register (struct regcache *regcache,
|
||||
else
|
||||
{
|
||||
if (th->stopped_at_software_breakpoint
|
||||
&& !th->pc_adjusted
|
||||
&& r == gdbarch_pc_regnum (gdbarch))
|
||||
{
|
||||
int size = register_size (gdbarch, r);
|
||||
@ -622,6 +623,8 @@ windows_fetch_one_register (struct regcache *regcache,
|
||||
value -= gdbarch_decr_pc_after_break (gdbarch);
|
||||
memcpy (context_offset, &value, size);
|
||||
}
|
||||
/* Make sure we only rewrite the PC a single time. */
|
||||
th->pc_adjusted = true;
|
||||
}
|
||||
regcache->raw_supply (r, context_offset);
|
||||
}
|
||||
@ -1757,6 +1760,7 @@ windows_nat_target::get_windows_debug_event (int pid,
|
||||
ptid_t ptid = ptid_t (current_event.dwProcessId, thread_id, 0);
|
||||
th = thread_rec (ptid, INVALIDATE_CONTEXT);
|
||||
th->stopped_at_software_breakpoint = true;
|
||||
th->pc_adjusted = false;
|
||||
}
|
||||
pending_stops.push_back ({thread_id, *ourstatus, current_event});
|
||||
thread_id = 0;
|
||||
@ -1835,7 +1839,11 @@ windows_nat_target::wait (ptid_t ptid, struct target_waitstatus *ourstatus,
|
||||
|| (current_event.u.Exception.ExceptionRecord.ExceptionCode
|
||||
== STATUS_WX86_BREAKPOINT))
|
||||
&& windows_initialization_done)
|
||||
current_windows_thread->stopped_at_software_breakpoint = true;
|
||||
{
|
||||
current_windows_thread->stopped_at_software_breakpoint
|
||||
= true;
|
||||
current_windows_thread->pc_adjusted = false;
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
|
Loading…
Reference in New Issue
Block a user