diff options
-rw-r--r-- | lldb/include/lldb/Breakpoint/BreakpointLocation.h | 4 | ||||
-rw-r--r-- | lldb/include/lldb/Breakpoint/BreakpointSite.h | 6 | ||||
-rw-r--r-- | lldb/source/Breakpoint/BreakpointLocation.cpp | 10 | ||||
-rw-r--r-- | lldb/source/Breakpoint/BreakpointLocationCollection.cpp | 1 | ||||
-rw-r--r-- | lldb/source/Breakpoint/BreakpointSite.cpp | 9 | ||||
-rw-r--r-- | lldb/source/Target/StopInfo.cpp | 14 | ||||
-rw-r--r-- | lldb/test/functionalities/attach_resume/TestAttachResume.py | 6 |
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), |