summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lldb/include/lldb/Breakpoint/BreakpointLocation.h4
-rw-r--r--lldb/include/lldb/Breakpoint/BreakpointSite.h6
-rw-r--r--lldb/source/Breakpoint/BreakpointLocation.cpp10
-rw-r--r--lldb/source/Breakpoint/BreakpointLocationCollection.cpp1
-rw-r--r--lldb/source/Breakpoint/BreakpointSite.cpp9
-rw-r--r--lldb/source/Target/StopInfo.cpp14
-rw-r--r--lldb/test/functionalities/attach_resume/TestAttachResume.py6
7 files changed, 46 insertions, 4 deletions
diff --git a/lldb/include/lldb/Breakpoint/BreakpointLocation.h b/lldb/include/lldb/Breakpoint/BreakpointLocation.h
index 5097150d682..8d5ebce411d 100644
--- a/lldb/include/lldb/Breakpoint/BreakpointLocation.h
+++ b/lldb/include/lldb/Breakpoint/BreakpointLocation.h
@@ -387,6 +387,7 @@ public:
bool EquivalentToLocation(BreakpointLocation &location);
protected:
+ friend class BreakpointSite;
friend class BreakpointLocationList;
friend class Process;
@@ -413,6 +414,9 @@ private:
void
SwapLocation (lldb::BreakpointLocationSP swap_from);
+ void
+ BumpHitCount();
+
//------------------------------------------------------------------
// Constructors and Destructors
diff --git a/lldb/include/lldb/Breakpoint/BreakpointSite.h b/lldb/include/lldb/Breakpoint/BreakpointSite.h
index 1d2cbea18f9..c6dbef781f2 100644
--- a/lldb/include/lldb/Breakpoint/BreakpointSite.h
+++ b/lldb/include/lldb/Breakpoint/BreakpointSite.h
@@ -259,6 +259,12 @@ public:
private:
friend class Process;
friend class BreakpointLocation;
+ // The StopInfoBreakpoint knows when it is processing a hit for a thread for a site, so let it be the
+ // one to manage setting the location hit count once and only once.
+ friend class StopInfoBreakpoint;
+
+ void
+ BumpHitCounts();
//------------------------------------------------------------------
/// The method removes the owner at \a break_loc_id from this breakpoint list.
diff --git a/lldb/source/Breakpoint/BreakpointLocation.cpp b/lldb/source/Breakpoint/BreakpointLocation.cpp
index 02d9609e248..11ecfecc5bc 100644
--- a/lldb/source/Breakpoint/BreakpointLocation.cpp
+++ b/lldb/source/Breakpoint/BreakpointLocation.cpp
@@ -449,8 +449,7 @@ BreakpointLocation::ShouldStop (StoppointCallbackContext *context)
bool should_stop = true;
Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS);
- IncrementHitCount();
-
+ // Do this first, if a location is disabled, it shouldn't increment its hit count.
if (!IsEnabled())
return false;
@@ -474,6 +473,13 @@ BreakpointLocation::ShouldStop (StoppointCallbackContext *context)
return should_stop;
}
+void
+BreakpointLocation::BumpHitCount()
+{
+ if (IsEnabled())
+ IncrementHitCount();
+}
+
bool
BreakpointLocation::IsResolved () const
{
diff --git a/lldb/source/Breakpoint/BreakpointLocationCollection.cpp b/lldb/source/Breakpoint/BreakpointLocationCollection.cpp
index ee3f56f928d..5756ccedfaa 100644
--- a/lldb/source/Breakpoint/BreakpointLocationCollection.cpp
+++ b/lldb/source/Breakpoint/BreakpointLocationCollection.cpp
@@ -196,3 +196,4 @@ BreakpointLocationCollection::GetDescription (Stream *s, lldb::DescriptionLevel
(*pos)->GetDescription(s, level);
}
}
+
diff --git a/lldb/source/Breakpoint/BreakpointSite.cpp b/lldb/source/Breakpoint/BreakpointSite.cpp
index 3cf6d37af37..469514b03f8 100644
--- a/lldb/source/Breakpoint/BreakpointSite.cpp
+++ b/lldb/source/Breakpoint/BreakpointSite.cpp
@@ -199,6 +199,15 @@ BreakpointSite::ValidForThisThread (Thread *thread)
return m_owners.ValidForThisThread(thread);
}
+void
+BreakpointSite::BumpHitCounts()
+{
+ for (BreakpointLocationSP loc_sp : m_owners.BreakpointLocations())
+ {
+ loc_sp->BumpHitCount();
+ }
+}
+
bool
BreakpointSite::IntersectsRange(lldb::addr_t addr, size_t size, lldb::addr_t *intersect_addr, size_t *intersect_size, size_t *opcode_offset) const
{
diff --git a/lldb/source/Target/StopInfo.cpp b/lldb/source/Target/StopInfo.cpp
index 99b1ac1f3e3..4b57ca65a2d 100644
--- a/lldb/source/Target/StopInfo.cpp
+++ b/lldb/source/Target/StopInfo.cpp
@@ -182,6 +182,7 @@ public:
{
ExecutionContext exe_ctx (thread_sp->GetStackFrameAtIndex(0));
StoppointCallbackContext context (event_ptr, exe_ctx, true);
+ bp_site_sp->BumpHitCounts();
m_should_stop = bp_site_sp->ShouldStop (&context);
}
else
@@ -403,10 +404,21 @@ protected:
// Let's copy the breakpoint locations out of the site and store them in a local list. That way if
// one of the breakpoint actions changes the site, then we won't be operating on a bad list.
+ // For safety's sake let's also grab an extra reference to the breakpoint owners of the locations we're
+ // going to examine, since the locations are going to have to get back to their breakpoints, and the
+ // locations don't keep their owners alive. I'm just sticking the BreakpointSP's in a vector since
+ // I'm only really using it to locally increment their retain counts.
BreakpointLocationCollection site_locations;
+ std::vector<lldb::BreakpointSP> location_owners;
+
for (size_t j = 0; j < num_owners; j++)
- site_locations.Add(bp_site_sp->GetOwnerAtIndex(j));
+ {
+ BreakpointLocationSP loc(bp_site_sp->GetOwnerAtIndex(j));
+ site_locations.Add(loc);
+ location_owners.push_back(loc->GetBreakpoint().shared_from_this());
+
+ }
for (size_t j = 0; j < num_owners; j++)
{
diff --git a/lldb/test/functionalities/attach_resume/TestAttachResume.py b/lldb/test/functionalities/attach_resume/TestAttachResume.py
index 2cdfba1a8b4..ef01fdacca7 100644
--- a/lldb/test/functionalities/attach_resume/TestAttachResume.py
+++ b/lldb/test/functionalities/attach_resume/TestAttachResume.py
@@ -80,8 +80,12 @@ class AttachResumeTestCase(TestBase):
self.assertTrue(wait_for_state(lldb.eStateStopped),
'Process not stopped after breakpoint')
+ # This test runs a bunch of threads in the same little function with this
+ # breakpoint. We want to make sure the breakpoint got hit at least once,
+ # but more than one thread may hit it at a time. So we really only care
+ # that is isn't 0 times, not how many times it is.
self.expect('br list', 'Breakpoint not hit',
- patterns = ['hit count = 1'])
+ patterns = ['hit count = [1-9]'])
self.runCmd("c")
self.assertTrue(wait_for_state(lldb.eStateRunning),
OpenPOWER on IntegriCloud