diff options
Diffstat (limited to 'lldb/source/Plugins/Process/Utility')
-rw-r--r-- | lldb/source/Plugins/Process/Utility/StopInfoMachException.cpp | 10 | ||||
-rw-r--r-- | lldb/source/Plugins/Process/Utility/StopInfoMachException.h | 3 |
2 files changed, 11 insertions, 2 deletions
diff --git a/lldb/source/Plugins/Process/Utility/StopInfoMachException.cpp b/lldb/source/Plugins/Process/Utility/StopInfoMachException.cpp index 71ec18fa97f..b62c0c340b2 100644 --- a/lldb/source/Plugins/Process/Utility/StopInfoMachException.cpp +++ b/lldb/source/Plugins/Process/Utility/StopInfoMachException.cpp @@ -245,7 +245,8 @@ StopInfoMachException::CreateStopReasonWithMachException uint32_t exc_type, uint32_t exc_data_count, uint64_t exc_code, - uint64_t exc_sub_code + uint64_t exc_sub_code, + uint64_t exc_sub_sub_code ) { if (exc_type != 0) @@ -303,10 +304,17 @@ StopInfoMachException::CreateStopReasonWithMachException return StopInfo::CreateStopReasonToTrace(thread); // It's a watchpoint, then. + // The exc_sub_code indicates the data break address. lldb::WatchpointLocationSP wp_loc_sp = thread.GetProcess().GetTarget().GetWatchpointLocationList().FindByAddress((lldb::addr_t)exc_sub_code); if (wp_loc_sp) + { + // 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_loc_sp->SetHardwareIndex((uint32_t)exc_sub_sub_code); return StopInfo::CreateStopReasonWithWatchpointID(thread, wp_loc_sp->GetID()); + } } else if (exc_code == 2) // EXC_I386_BPT { diff --git a/lldb/source/Plugins/Process/Utility/StopInfoMachException.h b/lldb/source/Plugins/Process/Utility/StopInfoMachException.h index f9036a47169..9ddf7a530ce 100644 --- a/lldb/source/Plugins/Process/Utility/StopInfoMachException.h +++ b/lldb/source/Plugins/Process/Utility/StopInfoMachException.h @@ -60,7 +60,8 @@ public: uint32_t exc_type, uint32_t exc_data_count, uint64_t exc_code, - uint64_t exc_subcode); + uint64_t exc_sub_code, + uint64_t exc_sub_sub_code); protected: uint32_t m_exc_data_count; |