diff options
author | Jim Ingham <jingham@apple.com> | 2010-08-10 00:59:59 +0000 |
---|---|---|
committer | Jim Ingham <jingham@apple.com> | 2010-08-10 00:59:59 +0000 |
commit | 3ebcf7f09bd70a41af22b627e8302cccb001053f (patch) | |
tree | d894f33a1eb348c7d27717f31c514e6b6abca1a8 /lldb/source | |
parent | 1ac0e2a027303228088454ffb1d378c1c2b25f39 (diff) | |
download | bcm5719-llvm-3ebcf7f09bd70a41af22b627e8302cccb001053f.tar.gz bcm5719-llvm-3ebcf7f09bd70a41af22b627e8302cccb001053f.zip |
Make breakpoint commands work again. Added a PerformAction to the stop info - actions are run when the
stop event is pulled from the event queue. Then made the StopInfoBreakpoint's PerformAction do the
breakpoint command.
Also fixed the StopInfoBreakpoint's GetDescription so it gets the breakpoint location info, not the breakpoint
site info.
llvm-svn: 110637
Diffstat (limited to 'lldb/source')
-rw-r--r-- | lldb/source/Target/Process.cpp | 23 | ||||
-rw-r--r-- | lldb/source/Target/StopInfo.cpp | 46 |
2 files changed, 48 insertions, 21 deletions
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(); } |