bool ItaniumABILanguageRuntime::ExceptionBreakpointsExplainStop( lldb::StopInfoSP stop_reason) { if (!m_process) return false; if (!stop_reason || stop_reason->GetStopReason() != eStopReasonBreakpoint) return false; uint64_t break_site_id = stop_reason->GetValue(); return m_process->GetBreakpointSiteList().BreakpointSiteContainsBreakpoint( break_site_id, m_cxx_exception_bp_sp->GetID()); }
bool ThreadPlanStepRange::NextRangeBreakpointExplainsStop (lldb::StopInfoSP stop_info_sp) { if (!m_next_branch_bp_sp) return false; break_id_t bp_site_id = stop_info_sp->GetValue(); BreakpointSiteSP bp_site_sp = m_thread.GetProcess()->GetBreakpointSiteList().FindByID(bp_site_id); if (!bp_site_sp->IsBreakpointAtThisSite (m_next_branch_bp_sp->GetID())) return false; else return bp_site_sp->GetNumberOfOwners() == 1; }
bool ItaniumABILanguageRuntime::ExceptionBreakpointsExplainStop (lldb::StopInfoSP stop_reason) { if (!m_process) return false; if (!stop_reason || stop_reason->GetStopReason() != eStopReasonBreakpoint) return false; uint64_t break_site_id = stop_reason->GetValue(); lldb::BreakpointSiteSP bp_site_sp = m_process->GetBreakpointSiteList().FindByID(break_site_id); if (!bp_site_sp) return false; uint32_t num_owners = bp_site_sp->GetNumberOfOwners(); bool check_cxx_exception = false; break_id_t cxx_exception_bid; bool check_cxx_exception_alloc = false; break_id_t cxx_exception_alloc_bid; if (m_cxx_exception_bp_sp) { check_cxx_exception = true; cxx_exception_bid = m_cxx_exception_bp_sp->GetID(); } if (m_cxx_exception_alloc_bp_sp) { check_cxx_exception_alloc = true; cxx_exception_alloc_bid = m_cxx_exception_alloc_bp_sp->GetID(); } for (uint32_t i = 0; i < num_owners; i++) { break_id_t bid = bp_site_sp->GetOwnerAtIndex(i)->GetBreakpoint().GetID(); if ((check_cxx_exception && (bid == cxx_exception_bid)) || (check_cxx_exception_alloc && (bid == cxx_exception_alloc_bid))) return true; } return false; }
bool ThreadPlanStepRange::NextRangeBreakpointExplainsStop (lldb::StopInfoSP stop_info_sp) { Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP)); if (!m_next_branch_bp_sp) return false; break_id_t bp_site_id = stop_info_sp->GetValue(); BreakpointSiteSP bp_site_sp = m_thread.GetProcess()->GetBreakpointSiteList().FindByID(bp_site_id); if (!bp_site_sp) return false; else if (!bp_site_sp->IsBreakpointAtThisSite (m_next_branch_bp_sp->GetID())) return false; else { // If we've hit the next branch breakpoint, then clear it. size_t num_owners = bp_site_sp->GetNumberOfOwners(); bool explains_stop = true; // If all the owners are internal, then we are probably just stepping over this range from multiple threads, // or multiple frames, so we want to continue. If one is not internal, then we should not explain the stop, // and let the user breakpoint handle the stop. for (size_t i = 0; i < num_owners; i++) { if (!bp_site_sp->GetOwnerAtIndex(i)->GetBreakpoint().IsInternal()) { explains_stop = false; break; } } if (log) log->Printf ("ThreadPlanStepRange::NextRangeBreakpointExplainsStop - Hit next range breakpoint which has %zu owners - explains stop: %u.", num_owners, explains_stop); ClearNextBranchBreakpoint(); return explains_stop; } }