forked from OSchip/llvm-project
If a single step ends on a breakpoint, it should be reported as a breakpoint hit
even though the underlying exception is a trace exception. <rdar://problem/15243355> llvm-svn: 204534
This commit is contained in:
parent
d1c22bef6f
commit
7dabe1a1b6
|
@ -363,20 +363,30 @@ StopInfoMachException::CreateStopReasonWithMachException
|
|||
if (exc_code == 1) // EXC_I386_SGL
|
||||
{
|
||||
if (!exc_sub_code)
|
||||
return StopInfo::CreateStopReasonToTrace(thread);
|
||||
|
||||
// It's a watchpoint, then.
|
||||
// The exc_sub_code indicates the data break address.
|
||||
lldb::WatchpointSP wp_sp;
|
||||
if (target)
|
||||
wp_sp = target->GetWatchpointList().FindByAddress((lldb::addr_t)exc_sub_code);
|
||||
if (wp_sp && wp_sp->IsEnabled())
|
||||
{
|
||||
// Debugserver may piggyback the hardware index of the fired watchpoint in the exception data.
|
||||
// Set the hardware index if that's the case.
|
||||
if (exc_data_count >=3)
|
||||
wp_sp->SetHardwareIndex((uint32_t)exc_sub_sub_code);
|
||||
return StopInfo::CreateStopReasonWithWatchpointID(thread, wp_sp->GetID());
|
||||
// This looks like a plain trap.
|
||||
// Have to check if there is a breakpoint here as well. When you single-step onto a trap,
|
||||
// the single step stops you not to trap. Since we also do that check below, let's just use
|
||||
// that logic.
|
||||
is_actual_breakpoint = true;
|
||||
is_trace_if_actual_breakpoint_missing = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
// It's a watchpoint, then.
|
||||
// The exc_sub_code indicates the data break address.
|
||||
lldb::WatchpointSP wp_sp;
|
||||
if (target)
|
||||
wp_sp = target->GetWatchpointList().FindByAddress((lldb::addr_t)exc_sub_code);
|
||||
if (wp_sp && wp_sp->IsEnabled())
|
||||
{
|
||||
// Debugserver may piggyback the hardware index of the fired watchpoint in the exception data.
|
||||
// Set the hardware index if that's the case.
|
||||
if (exc_data_count >=3)
|
||||
wp_sp->SetHardwareIndex((uint32_t)exc_sub_sub_code);
|
||||
return StopInfo::CreateStopReasonWithWatchpointID(thread, wp_sp->GetID());
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (exc_code == 2 || // EXC_I386_BPT
|
||||
|
|
Loading…
Reference in New Issue