diff options
-rw-r--r-- | lldb/include/lldb/Target/StopInfo.h | 7 | ||||
-rw-r--r-- | lldb/source/Target/Process.cpp | 23 | ||||
-rw-r--r-- | lldb/source/Target/StopInfo.cpp | 46 |
3 files changed, 55 insertions, 21 deletions
diff --git a/lldb/include/lldb/Target/StopInfo.h b/lldb/include/lldb/Target/StopInfo.h index 63cfd019690..d348ae9b3b7 100644 --- a/lldb/include/lldb/Target/StopInfo.h +++ b/lldb/include/lldb/Target/StopInfo.h @@ -54,6 +54,13 @@ public: virtual lldb::StopReason GetStopReason () const = 0; + + // Perform any action that is associated with this stop. This is done as the + // Event is removed from the event queue. + virtual void + PerformAction (Event *event_ptr) + { + } // Stop the thread by default. Subclasses can override this to allow // the thread to continue if desired. diff --git a/lldb/source/Target/Process.cpp b/lldb/source/Target/Process.cpp index 148eabe1ea3..1a1f93c2ada 100644 --- a/lldb/source/Target/Process.cpp +++ b/lldb/source/Target/Process.cpp @@ -1746,8 +1746,6 @@ Process::ProcessEventData::DoOnRemoval (Event *event_ptr) int num_threads = m_process_sp->GetThreadList().GetSize(); int idx; - int32_t should_stop_count = -1; - int32_t should_run_count = -1; for (idx = 0; idx < num_threads; ++idx) { lldb::ThreadSP thread_sp = m_process_sp->GetThreadList().GetThreadAtIndex(idx); @@ -1755,25 +1753,14 @@ Process::ProcessEventData::DoOnRemoval (Event *event_ptr) StopInfo *stop_info = thread_sp->GetStopInfo (); if (stop_info) { - if (stop_info->ShouldStop(event_ptr)) - { - if (should_stop_count < 0) - should_stop_count = 1; - else - should_stop_count++; - } - else - { - if (should_run_count < 0) - should_run_count = 1; - else - should_run_count++; - } + stop_info->PerformAction(event_ptr); } } - // Are we secretly watching the private state here? Should we look at the - // should_run_count or the "should_stop_count" and the "should_run_count"??? + // The stop action might restart the target. If it does, then we want to mark that in the + // event so that whoever is receiving it will know to wait for the running event and reflect + // that state appropriately. + if (m_process_sp->GetPrivateState() == eStateRunning) SetRestarted(true); } diff --git a/lldb/source/Target/StopInfo.cpp b/lldb/source/Target/StopInfo.cpp index 54fc6daeaf7..d301cc156ff 100644 --- a/lldb/source/Target/StopInfo.cpp +++ b/lldb/source/Target/StopInfo.cpp @@ -96,6 +96,35 @@ public: } return m_should_stop; } + + virtual void + PerformAction (Event *event_ptr) + { + BreakpointSiteSP bp_site_sp (m_thread.GetProcess().GetBreakpointSiteList().FindByID (m_value)); + if (bp_site_sp) + { + size_t num_owners = bp_site_sp->GetNumberOfOwners(); + for (size_t j = 0; j < num_owners; j++) + { + // The breakpoint action is an asynchronous breakpoint callback. If we ever need to have both + // callbacks and actions on the same breakpoint, we'll have to split this into two. + lldb::BreakpointLocationSP bp_loc_sp = bp_site_sp->GetOwnerAtIndex(j); + StoppointCallbackContext context (event_ptr, + &m_thread.GetProcess(), + &m_thread, + m_thread.GetStackFrameAtIndex(0).get(), + false); + bp_loc_sp->InvokeCallback (&context); + } + } + else + { + Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS); + + if (log) + log->Printf ("Process::%s could not find breakpoint site id: %lld...", __FUNCTION__, m_value); + } + } virtual bool ShouldNotify (Event *event_ptr) @@ -123,9 +152,20 @@ public: { if (m_description.empty()) { - StreamString strm; - strm.Printf("breakpoint %lli", m_value); - m_description.swap (strm.GetString()); + BreakpointSiteSP bp_site_sp (m_thread.GetProcess().GetBreakpointSiteList().FindByID (m_value)); + if (bp_site_sp) + { + StreamString strm; + strm.Printf("breakpoint "); + bp_site_sp->GetDescription(&strm, eDescriptionLevelBrief); + m_description.swap (strm.GetString()); + } + else + { + StreamString strm; + strm.Printf("breakpoint site %lli", m_value); + m_description.swap (strm.GetString()); + } } return m_description.c_str(); } |