1643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton//===-- StopInfo.cpp ---------------------------------------------*- C++ -*-===// 2643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton// 3643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton// The LLVM Compiler Infrastructure 4643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton// 5643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton// This file is distributed under the University of Illinois Open Source 6643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton// License. See LICENSE.TXT for details. 7643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton// 8643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton//===----------------------------------------------------------------------===// 9643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton 10d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea#include "lldb/lldb-python.h" 11d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea 12643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton#include "lldb/Target/StopInfo.h" 13643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton 14643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton// C Includes 15643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton// C++ Includes 16643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton#include <string> 17643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton 18643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton// Other libraries and framework includes 19643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton// Project includes 20643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton#include "lldb/Core/Log.h" 21640dc6b983964615bcb149d7d37ee007a13fb02cGreg Clayton#include "lldb/Breakpoint/Breakpoint.h" 22643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton#include "lldb/Breakpoint/BreakpointLocation.h" 23643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton#include "lldb/Breakpoint/StoppointCallbackContext.h" 24ecd4feb5111432d2878e95461220c720cb2d24c8Johnny Chen#include "lldb/Breakpoint/Watchpoint.h" 2521f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham#include "lldb/Core/Debugger.h" 26643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton#include "lldb/Core/StreamString.h" 2721f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham#include "lldb/Expression/ClangUserExpression.h" 2821f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham#include "lldb/Target/Target.h" 29643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton#include "lldb/Target/Thread.h" 30643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton#include "lldb/Target/ThreadPlan.h" 31643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton#include "lldb/Target/Process.h" 32643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton#include "lldb/Target/UnixSignals.h" 33643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton 34643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Claytonusing namespace lldb; 35643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Claytonusing namespace lldb_private; 36643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton 37643ee7301b5d4b05c321d906bc0d7ff11f571295Greg ClaytonStopInfo::StopInfo (Thread &thread, uint64_t value) : 388a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton m_thread_wp (thread.shared_from_this()), 39f4124deeb9532044a38c0774ced872f2709347daGreg Clayton m_stop_id (thread.GetProcess()->GetStopID()), 40f4124deeb9532044a38c0774ced872f2709347daGreg Clayton m_resume_id (thread.GetProcess()->GetResumeID()), 4189e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham m_value (value), 427c79a27b955432dfd3ad9439640f0af2eccf37b8Jim Ingham m_override_should_notify (eLazyBoolCalculate), 437c79a27b955432dfd3ad9439640f0af2eccf37b8Jim Ingham m_override_should_stop (eLazyBoolCalculate) 44643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton{ 45643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton} 46643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton 47643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Claytonbool 48643ee7301b5d4b05c321d906bc0d7ff11f571295Greg ClaytonStopInfo::IsValid () const 49643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton{ 508a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton ThreadSP thread_sp (m_thread_wp.lock()); 518a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton if (thread_sp) 528a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton return thread_sp->GetProcess()->GetStopID() == m_stop_id; 538a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton return false; 54643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton} 55643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton 5615dcb7ca49b8d8f46910cf085b4c249aac5317faJim Inghamvoid 5715dcb7ca49b8d8f46910cf085b4c249aac5317faJim InghamStopInfo::MakeStopInfoValid () 5815dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham{ 598a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton ThreadSP thread_sp (m_thread_wp.lock()); 608a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton if (thread_sp) 618a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton { 628a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton m_stop_id = thread_sp->GetProcess()->GetStopID(); 638a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton m_resume_id = thread_sp->GetProcess()->GetResumeID(); 648a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton } 6515dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham} 6615dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham 670296fe73a7cb1482226b1303a795ede00e12d677Jim Inghambool 680296fe73a7cb1482226b1303a795ede00e12d677Jim InghamStopInfo::HasTargetRunSinceMe () 6921f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham{ 708a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton ThreadSP thread_sp (m_thread_wp.lock()); 718a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton 728a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton if (thread_sp) 730296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham { 748a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton lldb::StateType ret_type = thread_sp->GetProcess()->GetPrivateState(); 758a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton if (ret_type == eStateRunning) 760296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham { 778a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton return true; 780296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham } 798a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton else if (ret_type == eStateStopped) 800296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham { 818a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton // This is a little tricky. We want to count "run and stopped again before you could 828a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton // ask this question as a "TRUE" answer to HasTargetRunSinceMe. But we don't want to 838a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton // include any running of the target done for expressions. So we track both resumes, 848a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton // and resumes caused by expressions, and check if there are any resumes NOT caused 858a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton // by expressions. 868a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton 878a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton uint32_t curr_resume_id = thread_sp->GetProcess()->GetResumeID(); 888a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton uint32_t last_user_expression_id = thread_sp->GetProcess()->GetLastUserExpressionResumeID (); 898a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton if (curr_resume_id == m_resume_id) 908a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton { 918a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton return false; 928a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton } 938a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton else if (curr_resume_id > last_user_expression_id) 948a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton { 958a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton return true; 968a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton } 970296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham } 980296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham } 990296fe73a7cb1482226b1303a795ede00e12d677Jim Ingham return false; 10021f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham} 10121f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham 102643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton//---------------------------------------------------------------------- 103643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton// StopInfoBreakpoint 104643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton//---------------------------------------------------------------------- 105643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton 10621f37ad875d4f50d1b4b3d307e120f6d27103730Jim Inghamnamespace lldb_private 10721f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham{ 108643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Claytonclass StopInfoBreakpoint : public StopInfo 109643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton{ 110643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Claytonpublic: 111643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton 112643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton StopInfoBreakpoint (Thread &thread, break_id_t break_id) : 113643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton StopInfo (thread, break_id), 114643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton m_description(), 115643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton m_should_stop (false), 116f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham m_should_stop_is_valid (false), 1171c65853cf0867d5037777eac76c3eaba67ee0081Jim Ingham m_should_perform_action (true), 1182753a024a5a314232baa579c0ada87551aa86988Jim Ingham m_address (LLDB_INVALID_ADDRESS), 1192753a024a5a314232baa579c0ada87551aa86988Jim Ingham m_break_id(LLDB_INVALID_BREAK_ID), 1202753a024a5a314232baa579c0ada87551aa86988Jim Ingham m_was_one_shot (false) 121643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton { 1222753a024a5a314232baa579c0ada87551aa86988Jim Ingham StoreBPInfo(); 123643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton } 124643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton 125d168690e51f9020b926d3d0d57dc9a2cfb2095a8Jim Ingham StopInfoBreakpoint (Thread &thread, break_id_t break_id, bool should_stop) : 126d168690e51f9020b926d3d0d57dc9a2cfb2095a8Jim Ingham StopInfo (thread, break_id), 127d168690e51f9020b926d3d0d57dc9a2cfb2095a8Jim Ingham m_description(), 128d168690e51f9020b926d3d0d57dc9a2cfb2095a8Jim Ingham m_should_stop (should_stop), 129f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham m_should_stop_is_valid (true), 1301c65853cf0867d5037777eac76c3eaba67ee0081Jim Ingham m_should_perform_action (true), 1312753a024a5a314232baa579c0ada87551aa86988Jim Ingham m_address (LLDB_INVALID_ADDRESS), 1322753a024a5a314232baa579c0ada87551aa86988Jim Ingham m_break_id(LLDB_INVALID_BREAK_ID), 1332753a024a5a314232baa579c0ada87551aa86988Jim Ingham m_was_one_shot (false) 1342753a024a5a314232baa579c0ada87551aa86988Jim Ingham { 1352753a024a5a314232baa579c0ada87551aa86988Jim Ingham StoreBPInfo(); 1362753a024a5a314232baa579c0ada87551aa86988Jim Ingham } 1372753a024a5a314232baa579c0ada87551aa86988Jim Ingham 1388a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton void 1398a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton StoreBPInfo () 140d168690e51f9020b926d3d0d57dc9a2cfb2095a8Jim Ingham { 1418a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton ThreadSP thread_sp (m_thread_wp.lock()); 1428a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton if (thread_sp) 1431c65853cf0867d5037777eac76c3eaba67ee0081Jim Ingham { 1448a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton BreakpointSiteSP bp_site_sp (thread_sp->GetProcess()->GetBreakpointSiteList().FindByID (m_value)); 1458a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton if (bp_site_sp) 1462753a024a5a314232baa579c0ada87551aa86988Jim Ingham { 1478a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton if (bp_site_sp->GetNumberOfOwners() == 1) 1482753a024a5a314232baa579c0ada87551aa86988Jim Ingham { 1498a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton BreakpointLocationSP bp_loc_sp = bp_site_sp->GetOwnerAtIndex(0); 1508a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton if (bp_loc_sp) 1518a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton { 1528a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton m_break_id = bp_loc_sp->GetBreakpoint().GetID(); 1538a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton m_was_one_shot = bp_loc_sp->GetBreakpoint().IsOneShot(); 1548a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton } 1552753a024a5a314232baa579c0ada87551aa86988Jim Ingham } 1568a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton m_address = bp_site_sp->GetLoadAddress(); 1572753a024a5a314232baa579c0ada87551aa86988Jim Ingham } 1581c65853cf0867d5037777eac76c3eaba67ee0081Jim Ingham } 159d168690e51f9020b926d3d0d57dc9a2cfb2095a8Jim Ingham } 160d168690e51f9020b926d3d0d57dc9a2cfb2095a8Jim Ingham 161643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton virtual ~StopInfoBreakpoint () 162643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton { 163643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton } 164643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton 165643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton virtual StopReason 166643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton GetStopReason () const 167643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton { 168643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton return eStopReasonBreakpoint; 169643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton } 170643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton 171643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton virtual bool 172e787c7ea61b1d857b56a0c42a1cf7535115ecbfcJim Ingham ShouldStopSynchronous (Event *event_ptr) 173643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton { 1748a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton ThreadSP thread_sp (m_thread_wp.lock()); 1758a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton if (thread_sp) 176643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton { 1778a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton if (!m_should_stop_is_valid) 178643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton { 1798a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton // Only check once if we should stop at a breakpoint 1808a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton BreakpointSiteSP bp_site_sp (thread_sp->GetProcess()->GetBreakpointSiteList().FindByID (m_value)); 1818a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton if (bp_site_sp) 1828a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton { 1838a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton ExecutionContext exe_ctx (thread_sp->GetStackFrameAtIndex(0)); 1848a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton StoppointCallbackContext context (event_ptr, exe_ctx, true); 1858a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton m_should_stop = bp_site_sp->ShouldStop (&context); 1868a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton } 1878a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton else 1888a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton { 1898a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 190643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton 1918a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton if (log) 1928a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton log->Printf ("Process::%s could not find breakpoint site id: %" PRId64 "...", __FUNCTION__, m_value); 193643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton 1948a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton m_should_stop = true; 1958a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton } 1968a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton m_should_stop_is_valid = true; 197643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton } 1988a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton return m_should_stop; 199643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton } 2008a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton return false; 201643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton } 2026fb8baa66796cdb23f337dd03272bf15d97fdab9Jim Ingham 20379f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham virtual bool 2047c79a27b955432dfd3ad9439640f0af2eccf37b8Jim Ingham DoShouldNotify (Event *event_ptr) 20579f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham { 2068a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton ThreadSP thread_sp (m_thread_wp.lock()); 2078a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton if (thread_sp) 20879f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham { 2098a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton BreakpointSiteSP bp_site_sp (thread_sp->GetProcess()->GetBreakpointSiteList().FindByID (m_value)); 2108a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton if (bp_site_sp) 21179f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham { 2128a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton bool all_internal = true; 2138a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton 2148a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton for (uint32_t i = 0; i < bp_site_sp->GetNumberOfOwners(); i++) 21579f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham { 2168a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton if (!bp_site_sp->GetOwnerAtIndex(i)->GetBreakpoint().IsInternal()) 2178a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton { 2188a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton all_internal = false; 2198a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton break; 2208a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton } 22179f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham } 2228a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton return all_internal == false; 22379f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham } 22479f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham } 22579f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham return true; 22679f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham } 22779f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham 22879f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham virtual const char * 22979f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham GetDescription () 23079f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham { 23179f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham if (m_description.empty()) 23279f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham { 2338a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton ThreadSP thread_sp (m_thread_wp.lock()); 2348a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton if (thread_sp) 23579f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham { 2368a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton BreakpointSiteSP bp_site_sp (thread_sp->GetProcess()->GetBreakpointSiteList().FindByID (m_value)); 2378a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton if (bp_site_sp) 238090f83176695d86197b0e86b67dee4160ec5003dJim Ingham { 2398a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton StreamString strm; 2408a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton // If we have just hit an internal breakpoint, and it has a kind description, print that instead of the 2418a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton // full breakpoint printing: 2428a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton if (bp_site_sp->IsInternal()) 243090f83176695d86197b0e86b67dee4160ec5003dJim Ingham { 2448a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton size_t num_owners = bp_site_sp->GetNumberOfOwners(); 2458a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton for (size_t idx = 0; idx < num_owners; idx++) 246090f83176695d86197b0e86b67dee4160ec5003dJim Ingham { 2478a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton const char *kind = bp_site_sp->GetOwnerAtIndex(idx)->GetBreakpoint().GetBreakpointKind(); 2488a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton if (kind != NULL) 2498a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton { 2508a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton m_description.assign (kind); 2518a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton return kind; 2528a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton } 253090f83176695d86197b0e86b67dee4160ec5003dJim Ingham } 254090f83176695d86197b0e86b67dee4160ec5003dJim Ingham } 2558a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton 2568a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton strm.Printf("breakpoint "); 2578a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton bp_site_sp->GetDescription(&strm, eDescriptionLevelBrief); 2588a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton m_description.swap (strm.GetString()); 259090f83176695d86197b0e86b67dee4160ec5003dJim Ingham } 2608a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton else 26179f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham { 2628a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton StreamString strm; 2638a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton if (m_break_id != LLDB_INVALID_BREAK_ID) 2644b01c3657bc415b52284f6a0b1654642c649f5e3Jim Ingham { 2658a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton BreakpointSP break_sp = thread_sp->GetProcess()->GetTarget().GetBreakpointByID(m_break_id); 2668a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton if (break_sp) 2674b01c3657bc415b52284f6a0b1654642c649f5e3Jim Ingham { 2688a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton if (break_sp->IsInternal()) 2698a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton { 2708a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton const char *kind = break_sp->GetBreakpointKind(); 2718a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton if (kind) 2728a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton strm.Printf ("internal %s breakpoint(%d).", kind, m_break_id); 2738a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton else 2748a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton strm.Printf ("internal breakpoint(%d).", m_break_id); 2758a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton } 2764b01c3657bc415b52284f6a0b1654642c649f5e3Jim Ingham else 2778a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton { 2788a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton strm.Printf ("breakpoint %d.", m_break_id); 2798a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton } 2808a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton } 2814b01c3657bc415b52284f6a0b1654642c649f5e3Jim Ingham else 2824b01c3657bc415b52284f6a0b1654642c649f5e3Jim Ingham { 2838a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton if (m_was_one_shot) 2848a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton strm.Printf ("one-shot breakpoint %d", m_break_id); 2858a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton else 2868a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton strm.Printf ("breakpoint %d which has been deleted.", m_break_id); 2874b01c3657bc415b52284f6a0b1654642c649f5e3Jim Ingham } 2884b01c3657bc415b52284f6a0b1654642c649f5e3Jim Ingham } 2898a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton else if (m_address == LLDB_INVALID_ADDRESS) 2908a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton strm.Printf("breakpoint site %" PRIi64 " which has been deleted - unknown address", m_value); 2918a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton else 2928a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton strm.Printf("breakpoint site %" PRIi64 " which has been deleted - was at 0x%" PRIx64, m_value, m_address); 2938a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton 2948a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton m_description.swap (strm.GetString()); 29579f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham } 29679f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham } 29779f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham } 29879f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham return m_description.c_str(); 29979f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham } 30079f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham 30179f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Inghamprotected: 302e787c7ea61b1d857b56a0c42a1cf7535115ecbfcJim Ingham bool 303e787c7ea61b1d857b56a0c42a1cf7535115ecbfcJim Ingham ShouldStop (Event *event_ptr) 304e787c7ea61b1d857b56a0c42a1cf7535115ecbfcJim Ingham { 305e787c7ea61b1d857b56a0c42a1cf7535115ecbfcJim Ingham // This just reports the work done by PerformAction or the synchronous stop. It should 306e787c7ea61b1d857b56a0c42a1cf7535115ecbfcJim Ingham // only ever get called after they have had a chance to run. 307e787c7ea61b1d857b56a0c42a1cf7535115ecbfcJim Ingham assert (m_should_stop_is_valid); 308e787c7ea61b1d857b56a0c42a1cf7535115ecbfcJim Ingham return m_should_stop; 309e787c7ea61b1d857b56a0c42a1cf7535115ecbfcJim Ingham } 310e787c7ea61b1d857b56a0c42a1cf7535115ecbfcJim Ingham 3116fb8baa66796cdb23f337dd03272bf15d97fdab9Jim Ingham virtual void 3126fb8baa66796cdb23f337dd03272bf15d97fdab9Jim Ingham PerformAction (Event *event_ptr) 3136fb8baa66796cdb23f337dd03272bf15d97fdab9Jim Ingham { 314f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (!m_should_perform_action) 315f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham return; 316f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham m_should_perform_action = false; 317f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 3188a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton ThreadSP thread_sp (m_thread_wp.lock()); 3198a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton 3208a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton if (thread_sp) 3216fb8baa66796cdb23f337dd03272bf15d97fdab9Jim Ingham { 3228a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS); 3238a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton 3248a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton if (!thread_sp->IsValid()) 3256fb8baa66796cdb23f337dd03272bf15d97fdab9Jim Ingham { 3268a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton // This shouldn't ever happen, but just in case, don't do more harm. 327a688acc09a9a3e31a02d34a58f21e034bdebcad4Jason Molenda if (log) 328a688acc09a9a3e31a02d34a58f21e034bdebcad4Jason Molenda { 329a688acc09a9a3e31a02d34a58f21e034bdebcad4Jason Molenda log->Printf ("PerformAction got called with an invalid thread."); 330a688acc09a9a3e31a02d34a58f21e034bdebcad4Jason Molenda } 331982a6ca16932c66f7a1451fbdca618a2ed1344f0Jim Ingham m_should_stop = true; 3328a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton m_should_stop_is_valid = true; 3338a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton return; 334982a6ca16932c66f7a1451fbdca618a2ed1344f0Jim Ingham } 3358a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton 3368a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton BreakpointSiteSP bp_site_sp (thread_sp->GetProcess()->GetBreakpointSiteList().FindByID (m_value)); 3378a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton 3388a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton if (bp_site_sp) 339982a6ca16932c66f7a1451fbdca618a2ed1344f0Jim Ingham { 3408a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton size_t num_owners = bp_site_sp->GetNumberOfOwners(); 3418a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton 3428a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton if (num_owners == 0) 343b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham { 3448a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton m_should_stop = true; 3458a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton } 3468a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton else 3478a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton { 3488a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton // We go through each location, and test first its condition. If the condition says to stop, 3498a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton // then we run the callback for that location. If that callback says to stop as well, then 3508a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton // we set m_should_stop to true; we are going to stop. 3518a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton // But we still want to give all the breakpoints whose conditions say we are going to stop a 3528a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton // chance to run their callbacks. 3538a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton // Of course if any callback restarts the target by putting "continue" in the callback, then 3548a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton // we're going to restart, without running the rest of the callbacks. And in this case we will 3558a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton // end up not stopping even if another location said we should stop. But that's better than not 3568a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton // running all the callbacks. 357b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham 3588a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton m_should_stop = false; 3598a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton 3608a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton ExecutionContext exe_ctx (thread_sp->GetStackFrameAtIndex(0)); 3618a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton Process *process = exe_ctx.GetProcessPtr(); 3628a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton if (process->GetModIDRef().IsLastResumeForUserExpression()) 363b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham { 3648a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton // If we are in the middle of evaluating an expression, don't run asynchronous breakpoint commands or 3658a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton // expressions. That could lead to infinite recursion if the command or condition re-calls the function 3668a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton // with this breakpoint. 3678a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton // TODO: We can keep a list of the breakpoints we've seen while running expressions in the nested 3688a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton // PerformAction calls that can arise when the action runs a function that hits another breakpoint, 3698a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton // and only stop running commands when we see the same breakpoint hit a second time. 3708a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton 3718a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton m_should_stop_is_valid = true; 3728a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton if (log) 3738a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton log->Printf ("StopInfoBreakpoint::PerformAction - Hit a breakpoint while running an expression," 3748a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton " not running commands to avoid recursion."); 3758a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton bool ignoring_breakpoints = process->GetIgnoreBreakpointsInExpressions(); 3768a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton if (ignoring_breakpoints) 377b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham { 3788a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton m_should_stop = false; 3798a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton // Internal breakpoints will always stop. 3808a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton for (size_t j = 0; j < num_owners; j++) 381b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham { 3828a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton lldb::BreakpointLocationSP bp_loc_sp = bp_site_sp->GetOwnerAtIndex(j); 3838a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton if (bp_loc_sp->GetBreakpoint().IsInternal()) 3848a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton { 3858a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton m_should_stop = true; 3868a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton break; 3878a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton } 388b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham } 389b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham } 3908a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton else 3918a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton { 3928a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton m_should_stop = true; 3938a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton } 3948a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton if (log) 3958a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton log->Printf ("StopInfoBreakpoint::PerformAction - in expression, continuing: %s.", 3968a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton m_should_stop ? "true" : "false"); 3978a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton process->GetTarget().GetDebugger().GetAsyncOutputStream()->Printf("Warning: hit breakpoint while " 3988a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton "running function, skipping commands and conditions to prevent recursion."); 3998a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton return; 400b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham } 4010bc756d6e062105aef9f1d761d1033a9daed8478Jim Ingham 4028a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton StoppointCallbackContext context (event_ptr, exe_ctx, false); 4030bc756d6e062105aef9f1d761d1033a9daed8478Jim Ingham 4048a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton // Let's copy the breakpoint locations out of the site and store them in a local list. That way if 4058a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton // one of the breakpoint actions changes the site, then we won't be operating on a bad list. 406982a6ca16932c66f7a1451fbdca618a2ed1344f0Jim Ingham 4078a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton BreakpointLocationCollection site_locations; 4088a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton for (size_t j = 0; j < num_owners; j++) 4098a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton site_locations.Add(bp_site_sp->GetOwnerAtIndex(j)); 4108a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton 4118a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton for (size_t j = 0; j < num_owners; j++) 41221f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham { 4138a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton lldb::BreakpointLocationSP bp_loc_sp = site_locations.GetByIndex(j); 4148a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton 4158a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton // If another action disabled this breakpoint or its location, then don't run the actions. 4168a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton if (!bp_loc_sp->IsEnabled() || !bp_loc_sp->GetBreakpoint().IsEnabled()) 4178a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton continue; 41821f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham 4198a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton // The breakpoint site may have many locations associated with it, not all of them valid for 4208a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton // this thread. Skip the ones that aren't: 4218a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton if (!bp_loc_sp->ValidForThisThread(thread_sp.get())) 4228a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton continue; 4238a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton 4248a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton // First run the condition for the breakpoint. If that says we should stop, then we'll run 4258a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton // the callback for the breakpoint. If the callback says we shouldn't stop that will win. 4268a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton 4278a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton if (bp_loc_sp->GetConditionText() != NULL) 42821f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham { 4298a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton Error condition_error; 4308a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton bool condition_says_stop = bp_loc_sp->ConditionSaysStop(exe_ctx, condition_error); 43121f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham 4328a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton if (!condition_error.Success()) 4338a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton { 4348a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton Debugger &debugger = exe_ctx.GetTargetRef().GetDebugger(); 4358a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton StreamSP error_sp = debugger.GetAsyncErrorStream (); 4368a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton error_sp->Printf ("Stopped due to an error evaluating condition of breakpoint "); 4378a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton bp_loc_sp->GetDescription (error_sp.get(), eDescriptionLevelBrief); 4388a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton error_sp->Printf (": \"%s\"", 4398a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton bp_loc_sp->GetConditionText()); 4408a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton error_sp->EOL(); 4418a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton const char *err_str = condition_error.AsCString("<Unknown Error>"); 4428a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton if (log) 4438a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton log->Printf("Error evaluating condition: \"%s\"\n", err_str); 4448a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton 4458a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton error_sp->PutCString (err_str); 4468a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton error_sp->EOL(); 4478a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton error_sp->Flush(); 4488a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton // If the condition fails to be parsed or run, we should stop. 4498a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton condition_says_stop = true; 4508a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton } 4518a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton else 4528a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton { 4538a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton if (!condition_says_stop) 4548a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton continue; 4558a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton } 45621f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham } 4578a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton 4588a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton bool callback_says_stop; 4598a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton 4608a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton // FIXME: For now the callbacks have to run in async mode - the first time we restart we need 4618a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton // to get out of there. So set it here. 4628a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton // When we figure out how to nest breakpoint hits then this will change. 4638a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton 4648a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton Debugger &debugger = thread_sp->CalculateTarget()->GetDebugger(); 4658a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton bool old_async = debugger.GetAsyncExecution(); 4668a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton debugger.SetAsyncExecution (true); 4678a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton 4688a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton callback_says_stop = bp_loc_sp->InvokeCallback (&context); 4698a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton 4708a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton debugger.SetAsyncExecution (old_async); 4718a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton 4728a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton if (callback_says_stop) 4738a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton m_should_stop = true; 4748a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton 4758a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton // If we are going to stop for this breakpoint, then remove the breakpoint. 4768a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton if (callback_says_stop && bp_loc_sp && bp_loc_sp->GetBreakpoint().IsOneShot()) 47728195f9e55173cd06c3c5f9e69cefeb1d03cc129Sean Callanan { 4788a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton thread_sp->GetProcess()->GetTarget().RemoveBreakpointByID (bp_loc_sp->GetBreakpoint().GetID()); 4798a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton } 4808a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton 4818a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton // Also make sure that the callback hasn't continued the target. 4828a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton // If it did, when we'll set m_should_start to false and get out of here. 4838a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton if (HasTargetRunSinceMe ()) 4848a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton { 4858a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton m_should_stop = false; 4868a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton break; 48728195f9e55173cd06c3c5f9e69cefeb1d03cc129Sean Callanan } 488982a6ca16932c66f7a1451fbdca618a2ed1344f0Jim Ingham } 48921f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham } 4908a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton // We've figured out what this stop wants to do, so mark it as valid so we don't compute it again. 4918a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton m_should_stop_is_valid = true; 492982a6ca16932c66f7a1451fbdca618a2ed1344f0Jim Ingham 4938a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton } 4948a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton else 4958a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton { 4968a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton m_should_stop = true; 4978a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton m_should_stop_is_valid = true; 4988a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton Log * log_process(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 4996fb8baa66796cdb23f337dd03272bf15d97fdab9Jim Ingham 5008a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton if (log_process) 5018a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton log_process->Printf ("Process::%s could not find breakpoint site id: %" PRId64 "...", __FUNCTION__, m_value); 5028a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton } 5038a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton if (log) 5048a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton log->Printf ("Process::%s returning from action with m_should_stop: %d.", __FUNCTION__, m_should_stop); 5056fb8baa66796cdb23f337dd03272bf15d97fdab9Jim Ingham } 5066fb8baa66796cdb23f337dd03272bf15d97fdab9Jim Ingham } 507643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton 508643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Claytonprivate: 509643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton std::string m_description; 510643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton bool m_should_stop; 511643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton bool m_should_stop_is_valid; 512f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham bool m_should_perform_action; // Since we are trying to preserve the "state" of the system even if we run functions 513f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham // etc. behind the users backs, we need to make sure we only REALLY perform the action once. 5141c65853cf0867d5037777eac76c3eaba67ee0081Jim Ingham lldb::addr_t m_address; // We use this to capture the breakpoint site address when we create the StopInfo, 5151c65853cf0867d5037777eac76c3eaba67ee0081Jim Ingham // in case somebody deletes it between the time the StopInfo is made and the 5161c65853cf0867d5037777eac76c3eaba67ee0081Jim Ingham // description is asked for. 5172753a024a5a314232baa579c0ada87551aa86988Jim Ingham lldb::break_id_t m_break_id; 5182753a024a5a314232baa579c0ada87551aa86988Jim Ingham bool m_was_one_shot; 519643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton}; 520643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton 521643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton 522643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton//---------------------------------------------------------------------- 523643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton// StopInfoWatchpoint 524643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton//---------------------------------------------------------------------- 525643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton 526643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Claytonclass StopInfoWatchpoint : public StopInfo 527643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton{ 528643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Claytonpublic: 52979f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham // Make sure watchpoint is properly disabled and subsequently enabled while performing watchpoint actions. 53079f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham class WatchpointSentry { 53179f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham public: 53279f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham WatchpointSentry(Process *p, Watchpoint *w): 53379f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham process(p), 53479f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham watchpoint(w) 53579f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham { 53679f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham if (process && watchpoint) 53779f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham { 5389c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham const bool notify = false; 53979f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham watchpoint->TurnOnEphemeralMode(); 5409c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham process->DisableWatchpoint(watchpoint, notify); 54179f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham } 54279f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham } 54379f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham ~WatchpointSentry() 54479f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham { 54579f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham if (process && watchpoint) 54679f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham { 54779f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham if (!watchpoint->IsDisabledDuringEphemeralMode()) 5489c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham { 5499c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham const bool notify = false; 5509c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham process->EnableWatchpoint(watchpoint, notify); 5519c970a371511a0e31ba9360aa841d445792c1ab0Jim Ingham } 55279f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham watchpoint->TurnOffEphemeralMode(); 55379f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham } 55479f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham } 55579f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham private: 55679f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham Process *process; 55779f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham Watchpoint *watchpoint; 55879f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham }; 559643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton 560643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton StopInfoWatchpoint (Thread &thread, break_id_t watch_id) : 561043f8c230739ceab194257a617731ecd28e1a912Johnny Chen StopInfo(thread, watch_id), 562043f8c230739ceab194257a617731ecd28e1a912Johnny Chen m_description(), 563043f8c230739ceab194257a617731ecd28e1a912Johnny Chen m_should_stop(false), 564043f8c230739ceab194257a617731ecd28e1a912Johnny Chen m_should_stop_is_valid(false) 565643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton { 566643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton } 567643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton 568643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton virtual ~StopInfoWatchpoint () 569643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton { 570643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton } 571643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton 572643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton virtual StopReason 573643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton GetStopReason () const 574643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton { 575643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton return eStopReasonWatchpoint; 576643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton } 577643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton 57879f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham virtual const char * 57979f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham GetDescription () 58079f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham { 58179f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham if (m_description.empty()) 58279f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham { 58379f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham StreamString strm; 5845f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea strm.Printf("watchpoint %" PRIi64, m_value); 58579f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham m_description.swap (strm.GetString()); 58679f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham } 58779f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham return m_description.c_str(); 58879f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham } 58979f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Ingham 59079f7143ebc923d1eaf62d671127a9dfe4b14a942Jim Inghamprotected: 591043f8c230739ceab194257a617731ecd28e1a912Johnny Chen virtual bool 5928b24f655f27e7289057892bce99780fe32f5fd0cJim Ingham ShouldStopSynchronous (Event *event_ptr) 593043f8c230739ceab194257a617731ecd28e1a912Johnny Chen { 594043f8c230739ceab194257a617731ecd28e1a912Johnny Chen // ShouldStop() method is idempotent and should not affect hit count. 595712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen // See Process::RunPrivateStateThread()->Process()->HandlePrivateEvent() 596712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen // -->Process()::ShouldBroadcastEvent()->ThreadList::ShouldStop()-> 597712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen // Thread::ShouldStop()->ThreadPlanBase::ShouldStop()-> 598712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen // StopInfoWatchpoint::ShouldStop() and 599712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen // Event::DoOnRemoval()->Process::ProcessEventData::DoOnRemoval()-> 600712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen // StopInfoWatchpoint::PerformAction(). 601043f8c230739ceab194257a617731ecd28e1a912Johnny Chen if (m_should_stop_is_valid) 602043f8c230739ceab194257a617731ecd28e1a912Johnny Chen return m_should_stop; 603043f8c230739ceab194257a617731ecd28e1a912Johnny Chen 6048a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton ThreadSP thread_sp (m_thread_wp.lock()); 6058a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton if (thread_sp) 606043f8c230739ceab194257a617731ecd28e1a912Johnny Chen { 6078a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton WatchpointSP wp_sp (thread_sp->CalculateTarget()->GetWatchpointList().FindByID(GetValue())); 6088a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton if (wp_sp) 6098a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton { 6108a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton // Check if we should stop at a watchpoint. 6118a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton ExecutionContext exe_ctx (thread_sp->GetStackFrameAtIndex(0)); 6128a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton StoppointCallbackContext context (event_ptr, exe_ctx, true); 6138a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton m_should_stop = wp_sp->ShouldStop (&context); 6148a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton } 6158a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton else 6168a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton { 6178a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 618043f8c230739ceab194257a617731ecd28e1a912Johnny Chen 6198a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton if (log) 6208a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton log->Printf ("Process::%s could not find watchpoint location id: %" PRId64 "...", 6218a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton __FUNCTION__, GetValue()); 622043f8c230739ceab194257a617731ecd28e1a912Johnny Chen 6238a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton m_should_stop = true; 6248a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton } 625043f8c230739ceab194257a617731ecd28e1a912Johnny Chen } 626043f8c230739ceab194257a617731ecd28e1a912Johnny Chen m_should_stop_is_valid = true; 627043f8c230739ceab194257a617731ecd28e1a912Johnny Chen return m_should_stop; 628043f8c230739ceab194257a617731ecd28e1a912Johnny Chen } 629043f8c230739ceab194257a617731ecd28e1a912Johnny Chen 6308b24f655f27e7289057892bce99780fe32f5fd0cJim Ingham bool 6318b24f655f27e7289057892bce99780fe32f5fd0cJim Ingham ShouldStop (Event *event_ptr) 6328b24f655f27e7289057892bce99780fe32f5fd0cJim Ingham { 6338b24f655f27e7289057892bce99780fe32f5fd0cJim Ingham // This just reports the work done by PerformAction or the synchronous stop. It should 6348b24f655f27e7289057892bce99780fe32f5fd0cJim Ingham // only ever get called after they have had a chance to run. 6358b24f655f27e7289057892bce99780fe32f5fd0cJim Ingham assert (m_should_stop_is_valid); 6368b24f655f27e7289057892bce99780fe32f5fd0cJim Ingham return m_should_stop; 6378b24f655f27e7289057892bce99780fe32f5fd0cJim Ingham } 6388b24f655f27e7289057892bce99780fe32f5fd0cJim Ingham 639712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen virtual void 640712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen PerformAction (Event *event_ptr) 641712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen { 642952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS); 643712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen // We're going to calculate if we should stop or not in some way during the course of 644712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen // this code. Also by default we're going to stop, so set that here. 645712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen m_should_stop = true; 646712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen 6478a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton ThreadSP thread_sp (m_thread_wp.lock()); 6488a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton if (thread_sp) 649712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen { 650bd446f1c519f466a2e24790fd1c362fc06897673Johnny Chen 6518a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton WatchpointSP wp_sp (thread_sp->CalculateTarget()->GetWatchpointList().FindByID(GetValue())); 6528a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton if (wp_sp) 6537de2a3b03f37987c67f142ce328cc2484c831468Enrico Granata { 6548a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton ExecutionContext exe_ctx (thread_sp->GetStackFrameAtIndex(0)); 6558a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton Process* process = exe_ctx.GetProcessPtr(); 6568a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton 6578a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton // This sentry object makes sure the current watchpoint is disabled while performing watchpoint actions, 6588a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton // and it is then enabled after we are finished. 6598a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton WatchpointSentry sentry(process, wp_sp.get()); 6608a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton 6617de2a3b03f37987c67f142ce328cc2484c831468Enrico Granata { 6628a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton // check if this process is running on an architecture where watchpoints trigger 6638a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton // before the associated instruction runs. if so, disable the WP, single-step and then 6648a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton // re-enable the watchpoint 6658a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton if (process) 6667de2a3b03f37987c67f142ce328cc2484c831468Enrico Granata { 66708f60c88b61c42c35abf3233f0cbe19d29fbe814Jason Molenda uint32_t num; 66808f60c88b61c42c35abf3233f0cbe19d29fbe814Jason Molenda bool wp_triggers_after; 6698a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton if (process->GetWatchpointSupportInfo(num, wp_triggers_after).Success()) 6707de2a3b03f37987c67f142ce328cc2484c831468Enrico Granata { 6718a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton if (!wp_triggers_after) 6728a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton { 673a0e48cc2e971aeb4287dba435cefeb0acdbf006aJim Ingham StopInfoSP stored_stop_info_sp = thread_sp->GetStopInfo(); 674a0e48cc2e971aeb4287dba435cefeb0acdbf006aJim Ingham assert (stored_stop_info_sp.get() == this); 675a0e48cc2e971aeb4287dba435cefeb0acdbf006aJim Ingham 676008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham ThreadPlanSP new_plan_sp(thread_sp->QueueThreadPlanForStepSingleInstruction(false, // step-over 677008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham false, // abort_other_plans 678008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham true)); // stop_other_threads 679008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham new_plan_sp->SetIsMasterPlan (true); 680008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham new_plan_sp->SetOkayToDiscard (false); 681008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham new_plan_sp->SetPrivate (true); 6828a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton process->GetThreadList().SetSelectedThreadByID (thread_sp->GetID()); 6838a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton process->Resume (); 6848a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton process->WaitForProcessToStop (NULL); 6858a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton process->GetThreadList().SetSelectedThreadByID (thread_sp->GetID()); 686a0e48cc2e971aeb4287dba435cefeb0acdbf006aJim Ingham thread_sp->SetStopInfo(stored_stop_info_sp); 6878a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton } 6887de2a3b03f37987c67f142ce328cc2484c831468Enrico Granata } 6897de2a3b03f37987c67f142ce328cc2484c831468Enrico Granata } 6907de2a3b03f37987c67f142ce328cc2484c831468Enrico Granata } 6919e98559420d8c7c248b0c75b48db65ffd878402bJohnny Chen 6928a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton if (m_should_stop && wp_sp->GetConditionText() != NULL) 693712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen { 6948a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton // We need to make sure the user sees any parse errors in their condition, so we'll hook the 6958a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton // constructor errors up to the debugger's Async I/O. 6968a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton ExecutionResults result_code; 6978a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton ValueObjectSP result_value_sp; 6988a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton const bool unwind_on_error = true; 6998a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton const bool ignore_breakpoints = true; 7008a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton Error error; 7018a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton result_code = ClangUserExpression::EvaluateWithError (exe_ctx, 7028a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton eExecutionPolicyOnlyWhenNeeded, 7038a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton lldb::eLanguageTypeUnknown, 7048a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton ClangUserExpression::eResultTypeAny, 7058a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton unwind_on_error, 7068a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton ignore_breakpoints, 7078a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton wp_sp->GetConditionText(), 7088a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton NULL, 7098a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton result_value_sp, 7108a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton error, 7118a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton true, 7128a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton ClangUserExpression::kDefaultTimeout); 7138a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton if (result_code == eExecutionCompleted) 714712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen { 7158a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton if (result_value_sp) 716712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen { 7178a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton Scalar scalar_value; 7188a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton if (result_value_sp->ResolveValue (scalar_value)) 719712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen { 7208a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton if (scalar_value.ULongLong(1) == 0) 7218a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton { 7228a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton // We have been vetoed. This takes precedence over querying 7238a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton // the watchpoint whether it should stop (aka ignore count and 7248a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton // friends). See also StopInfoWatchpoint::ShouldStop() as well 7258a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton // as Process::ProcessEventData::DoOnRemoval(). 7268a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton m_should_stop = false; 7278a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton } 7288a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton else 7298a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton m_should_stop = true; 7308a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton if (log) 7318a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton log->Printf("Condition successfully evaluated, result is %s.\n", 7328a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton m_should_stop ? "true" : "false"); 733712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen } 734712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen else 7358a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton { 736712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen m_should_stop = true; 7378a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton if (log) 7388a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton log->Printf("Failed to get an integer result from the expression."); 7398a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton } 740712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen } 741712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen } 7428a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton else 7438a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton { 7448a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton Debugger &debugger = exe_ctx.GetTargetRef().GetDebugger(); 7458a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton StreamSP error_sp = debugger.GetAsyncErrorStream (); 7468a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton error_sp->Printf ("Stopped due to an error evaluating condition of watchpoint "); 7478a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton wp_sp->GetDescription (error_sp.get(), eDescriptionLevelBrief); 7488a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton error_sp->Printf (": \"%s\"", 7498a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton wp_sp->GetConditionText()); 7508a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton error_sp->EOL(); 7518a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton const char *err_str = error.AsCString("<Unknown Error>"); 7528a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton if (log) 7538a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton log->Printf("Error evaluating condition: \"%s\"\n", err_str); 7548a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton 7558a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton error_sp->PutCString (err_str); 7568a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton error_sp->EOL(); 7578a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton error_sp->Flush(); 7588a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton // If the condition fails to be parsed or run, we should stop. 7598a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton m_should_stop = true; 7608a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton } 761712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen } 762712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen 7638a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton // If the condition says to stop, we run the callback to further decide whether to stop. 7648a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton if (m_should_stop) 7658a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton { 7668a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton StoppointCallbackContext context (event_ptr, exe_ctx, false); 7678a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton bool stop_requested = wp_sp->InvokeCallback (&context); 7688a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton // Also make sure that the callback hasn't continued the target. 7698a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton // If it did, when we'll set m_should_stop to false and get out of here. 7708a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton if (HasTargetRunSinceMe ()) 7718a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton m_should_stop = false; 7728a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton 7738a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton if (m_should_stop && !stop_requested) 7748a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton { 7758a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton // We have been vetoed by the callback mechanism. 7768a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton m_should_stop = false; 7778a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton } 778712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen } 7798a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton // Finally, if we are going to stop, print out the new & old values: 7808a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton if (m_should_stop) 78197600c1e01f4a6412ad3e3e61587a1e7229ce82dJohnny Chen { 7828a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton wp_sp->CaptureWatchedValue(exe_ctx); 7838a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton 7848a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton Debugger &debugger = exe_ctx.GetTargetRef().GetDebugger(); 7858a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton StreamSP output_sp = debugger.GetAsyncOutputStream (); 7868a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton wp_sp->DumpSnapshots(output_sp.get()); 7878a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton output_sp->EOL(); 7888a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton output_sp->Flush(); 78997600c1e01f4a6412ad3e3e61587a1e7229ce82dJohnny Chen } 7908a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton 79197600c1e01f4a6412ad3e3e61587a1e7229ce82dJohnny Chen } 7928a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton else 7939e376625d6354d77cd6240007f0d42034dd3f1eeJim Ingham { 7948a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton Log * log_process(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 7958a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton 7968a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton if (log_process) 7978a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton log_process->Printf ("Process::%s could not find watchpoint id: %" PRId64 "...", __FUNCTION__, m_value); 7989e376625d6354d77cd6240007f0d42034dd3f1eeJim Ingham } 7998a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton if (log) 8008a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton log->Printf ("Process::%s returning from action with m_should_stop: %d.", __FUNCTION__, m_should_stop); 8019e376625d6354d77cd6240007f0d42034dd3f1eeJim Ingham 8028a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton m_should_stop_is_valid = true; 803712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen } 804712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen } 805712a628dde2f4f786389feecf7e06e59f0853c75Johnny Chen 806643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Claytonprivate: 807643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton std::string m_description; 808043f8c230739ceab194257a617731ecd28e1a912Johnny Chen bool m_should_stop; 809043f8c230739ceab194257a617731ecd28e1a912Johnny Chen bool m_should_stop_is_valid; 810643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton}; 811643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton 812643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton 813643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton 814643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton//---------------------------------------------------------------------- 815643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton// StopInfoUnixSignal 816643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton//---------------------------------------------------------------------- 817643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton 818643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Claytonclass StopInfoUnixSignal : public StopInfo 819643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton{ 820643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Claytonpublic: 821643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton 822643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton StopInfoUnixSignal (Thread &thread, int signo) : 8236561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton StopInfo (thread, signo) 824643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton { 825643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton } 826643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton 827643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton virtual ~StopInfoUnixSignal () 828643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton { 829643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton } 830643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton 831643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton 832643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton virtual StopReason 833643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton GetStopReason () const 834643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton { 835643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton return eStopReasonSignal; 836643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton } 837643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton 838643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton virtual bool 83989e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham ShouldStopSynchronous (Event *event_ptr) 84089e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham { 8418a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton ThreadSP thread_sp (m_thread_wp.lock()); 8428a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton if (thread_sp) 8438a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton return thread_sp->GetProcess()->GetUnixSignals().GetShouldStop (m_value); 8448a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton return false; 84589e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham } 84689e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham 84789e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham virtual bool 848643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton ShouldStop (Event *event_ptr) 849643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton { 8508a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton ThreadSP thread_sp (m_thread_wp.lock()); 8518a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton if (thread_sp) 8528a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton return thread_sp->GetProcess()->GetUnixSignals().GetShouldStop (m_value); 8538a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton return false; 854643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton } 855643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton 856643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton 857643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton // If should stop returns false, check if we should notify of this event 858643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton virtual bool 8597c79a27b955432dfd3ad9439640f0af2eccf37b8Jim Ingham DoShouldNotify (Event *event_ptr) 860643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton { 8618a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton ThreadSP thread_sp (m_thread_wp.lock()); 8628a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton if (thread_sp) 86389e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham { 8648a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton bool should_notify = thread_sp->GetProcess()->GetUnixSignals().GetShouldNotify (m_value); 8658a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton if (should_notify) 8668a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton { 8678a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton StreamString strm; 8688a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton strm.Printf ("thread %d received signal: %s", 8698a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton thread_sp->GetIndexID(), 8708a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton thread_sp->GetProcess()->GetUnixSignals().GetSignalAsCString (m_value)); 8718a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton Process::ProcessEventData::AddRestartedReason(event_ptr, strm.GetData()); 8728a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton } 8738a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton return should_notify; 87489e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham } 8758a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton return true; 876643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton } 877643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton 878643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton 879643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton virtual void 880643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton WillResume (lldb::StateType resume_state) 881643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton { 8828a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton ThreadSP thread_sp (m_thread_wp.lock()); 8838a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton if (thread_sp) 8848a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton { 8858a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton if (thread_sp->GetProcess()->GetUnixSignals().GetShouldSuppress(m_value) == false) 8868a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton thread_sp->SetResumeSignal(m_value); 8878a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton } 888643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton } 889643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton 890643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton virtual const char * 891643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton GetDescription () 892643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton { 893643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton if (m_description.empty()) 894643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton { 8958a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton ThreadSP thread_sp (m_thread_wp.lock()); 8968a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton if (thread_sp) 8978a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton { 8988a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton StreamString strm; 8998a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton const char *signal_name = thread_sp->GetProcess()->GetUnixSignals().GetSignalAsCString (m_value); 9008a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton if (signal_name) 9018a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton strm.Printf("signal %s", signal_name); 9028a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton else 9038a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton strm.Printf("signal %" PRIi64, m_value); 9048a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton m_description.swap (strm.GetString()); 9058a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton } 906643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton } 907643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton return m_description.c_str(); 908643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton } 909643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton}; 910643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton 911643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton//---------------------------------------------------------------------- 912643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton// StopInfoTrace 913643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton//---------------------------------------------------------------------- 914643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton 915643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Claytonclass StopInfoTrace : public StopInfo 916643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton{ 917643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Claytonpublic: 918643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton 919643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton StopInfoTrace (Thread &thread) : 920643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton StopInfo (thread, LLDB_INVALID_UID) 921643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton { 922643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton } 923643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton 924643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton virtual ~StopInfoTrace () 925643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton { 926643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton } 927643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton 928643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton virtual StopReason 929643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton GetStopReason () const 930643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton { 931643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton return eStopReasonTrace; 932643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton } 933643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton 934643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton virtual const char * 935643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton GetDescription () 936643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton { 9376561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton if (m_description.empty()) 938643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton return "trace"; 9396561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton else 9406561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton return m_description.c_str(); 9416561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton } 9426561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton}; 9436561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton 9446561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton 9456561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton//---------------------------------------------------------------------- 9466561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton// StopInfoException 9476561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton//---------------------------------------------------------------------- 9486561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton 9496561155acc9dee660de73e4aa8215839a06f01a7Greg Claytonclass StopInfoException : public StopInfo 9506561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton{ 9516561155acc9dee660de73e4aa8215839a06f01a7Greg Claytonpublic: 9526561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton 9536561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton StopInfoException (Thread &thread, const char *description) : 9546561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton StopInfo (thread, LLDB_INVALID_UID) 9556561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton { 9566561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton if (description) 9576561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton SetDescription (description); 9586561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton } 9596561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton 9606561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton virtual 9616561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton ~StopInfoException () 9626561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton { 9636561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton } 9646561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton 9656561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton virtual StopReason 9666561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton GetStopReason () const 9676561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton { 9686561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton return eStopReasonException; 9696561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton } 9706561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton 9716561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton virtual const char * 9726561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton GetDescription () 9736561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton { 9746561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton if (m_description.empty()) 9756561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton return "exception"; 9766561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton else 9776561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton return m_description.c_str(); 978643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton } 979643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton}; 980643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton 981643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton 982643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton//---------------------------------------------------------------------- 983643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton// StopInfoThreadPlan 984643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton//---------------------------------------------------------------------- 985643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton 986643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Claytonclass StopInfoThreadPlan : public StopInfo 987643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton{ 988643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Claytonpublic: 989643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton 9901586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham StopInfoThreadPlan (ThreadPlanSP &plan_sp, ValueObjectSP &return_valobj_sp) : 991643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton StopInfo (plan_sp->GetThread(), LLDB_INVALID_UID), 9921586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham m_plan_sp (plan_sp), 9931586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham m_return_valobj_sp (return_valobj_sp) 994643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton { 995643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton } 996643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton 997643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton virtual ~StopInfoThreadPlan () 998643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton { 999643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton } 1000643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton 1001643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton virtual StopReason 1002643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton GetStopReason () const 1003643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton { 1004643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton return eStopReasonPlanComplete; 1005643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton } 1006643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton 1007643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton virtual const char * 1008643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton GetDescription () 1009643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton { 1010643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton if (m_description.empty()) 1011643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton { 1012643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton StreamString strm; 1013643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton m_plan_sp->GetDescription (&strm, eDescriptionLevelBrief); 1014643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton m_description.swap (strm.GetString()); 1015643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton } 1016643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton return m_description.c_str(); 1017643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton } 10181586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham 10191586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham ValueObjectSP 10201586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham GetReturnValueObject() 10211586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham { 10221586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham return m_return_valobj_sp; 10231586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham } 102489e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham 102589e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Inghamprotected: 102689e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham virtual bool 102789e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham ShouldStop (Event *event_ptr) 102889e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham { 102989e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham if (m_plan_sp) 103089e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham return m_plan_sp->ShouldStop(event_ptr); 103189e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham else 103289e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham return StopInfo::ShouldStop(event_ptr); 103389e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham } 1034643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton 1035643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Claytonprivate: 1036643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton ThreadPlanSP m_plan_sp; 10371586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham ValueObjectSP m_return_valobj_sp; 1038643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton}; 10390bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton 10400bce9a22354df3f00e68ffd912119a0741753b7fGreg Claytonclass StopInfoExec : public StopInfo 10410bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton{ 10420bce9a22354df3f00e68ffd912119a0741753b7fGreg Claytonpublic: 10430bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton 10440bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton StopInfoExec (Thread &thread) : 10450bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton StopInfo (thread, LLDB_INVALID_UID), 10460bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton m_performed_action (false) 10470bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton { 10480bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton } 10490bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton 10500bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton virtual 10510bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton ~StopInfoExec () 10520bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton { 10530bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton } 10540bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton 10550bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton virtual StopReason 10560bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton GetStopReason () const 10570bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton { 10580bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton return eStopReasonExec; 10590bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton } 10600bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton 10610bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton virtual const char * 10620bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton GetDescription () 10630bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton { 10640bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton return "exec"; 10650bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton } 10660bce9a22354df3f00e68ffd912119a0741753b7fGreg Claytonprotected: 10670bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton 10680bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton virtual void 10690bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton PerformAction (Event *event_ptr) 10700bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton { 10710bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton // Only perform the action once 10720bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton if (m_performed_action) 10730bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton return; 10740bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton m_performed_action = true; 10758a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton ThreadSP thread_sp (m_thread_wp.lock()); 10768a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton if (thread_sp) 10778a1e6542c5b125613ffce3039aa713ee6ea07dcfGreg Clayton thread_sp->GetProcess()->DidExec(); 10780bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton } 10790bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton 10800bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton bool m_performed_action; 10810bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton}; 10820bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton 108321f37ad875d4f50d1b4b3d307e120f6d27103730Jim Ingham} // namespace lldb_private 1084643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton 1085643ee7301b5d4b05c321d906bc0d7ff11f571295Greg ClaytonStopInfoSP 1086643ee7301b5d4b05c321d906bc0d7ff11f571295Greg ClaytonStopInfo::CreateStopReasonWithBreakpointSiteID (Thread &thread, break_id_t break_id) 1087643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton{ 1088643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton return StopInfoSP (new StopInfoBreakpoint (thread, break_id)); 1089643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton} 1090643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton 1091643ee7301b5d4b05c321d906bc0d7ff11f571295Greg ClaytonStopInfoSP 1092d168690e51f9020b926d3d0d57dc9a2cfb2095a8Jim InghamStopInfo::CreateStopReasonWithBreakpointSiteID (Thread &thread, break_id_t break_id, bool should_stop) 1093d168690e51f9020b926d3d0d57dc9a2cfb2095a8Jim Ingham{ 1094d168690e51f9020b926d3d0d57dc9a2cfb2095a8Jim Ingham return StopInfoSP (new StopInfoBreakpoint (thread, break_id, should_stop)); 1095d168690e51f9020b926d3d0d57dc9a2cfb2095a8Jim Ingham} 1096d168690e51f9020b926d3d0d57dc9a2cfb2095a8Jim Ingham 1097d168690e51f9020b926d3d0d57dc9a2cfb2095a8Jim InghamStopInfoSP 1098643ee7301b5d4b05c321d906bc0d7ff11f571295Greg ClaytonStopInfo::CreateStopReasonWithWatchpointID (Thread &thread, break_id_t watch_id) 1099643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton{ 1100643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton return StopInfoSP (new StopInfoWatchpoint (thread, watch_id)); 1101643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton} 1102643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton 1103643ee7301b5d4b05c321d906bc0d7ff11f571295Greg ClaytonStopInfoSP 1104643ee7301b5d4b05c321d906bc0d7ff11f571295Greg ClaytonStopInfo::CreateStopReasonWithSignal (Thread &thread, int signo) 1105643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton{ 1106643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton return StopInfoSP (new StopInfoUnixSignal (thread, signo)); 1107643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton} 1108643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton 1109643ee7301b5d4b05c321d906bc0d7ff11f571295Greg ClaytonStopInfoSP 1110643ee7301b5d4b05c321d906bc0d7ff11f571295Greg ClaytonStopInfo::CreateStopReasonToTrace (Thread &thread) 1111643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton{ 1112643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton return StopInfoSP (new StopInfoTrace (thread)); 1113643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton} 1114643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton 1115643ee7301b5d4b05c321d906bc0d7ff11f571295Greg ClaytonStopInfoSP 11161586d9720002e407a3a097baf302de5fa4ca9c1bJim InghamStopInfo::CreateStopReasonWithPlan (ThreadPlanSP &plan_sp, ValueObjectSP return_valobj_sp) 1117643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton{ 11181586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham return StopInfoSP (new StopInfoThreadPlan (plan_sp, return_valobj_sp)); 1119643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton} 11206561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton 11216561155acc9dee660de73e4aa8215839a06f01a7Greg ClaytonStopInfoSP 11226561155acc9dee660de73e4aa8215839a06f01a7Greg ClaytonStopInfo::CreateStopReasonWithException (Thread &thread, const char *description) 11236561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton{ 11246561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton return StopInfoSP (new StopInfoException (thread, description)); 11256561155acc9dee660de73e4aa8215839a06f01a7Greg Clayton} 11261586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham 11270bce9a22354df3f00e68ffd912119a0741753b7fGreg ClaytonStopInfoSP 11280bce9a22354df3f00e68ffd912119a0741753b7fGreg ClaytonStopInfo::CreateStopReasonWithExec (Thread &thread) 11290bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton{ 11300bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton return StopInfoSP (new StopInfoExec (thread)); 11310bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton} 11320bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton 11331586d9720002e407a3a097baf302de5fa4ca9c1bJim InghamValueObjectSP 11341586d9720002e407a3a097baf302de5fa4ca9c1bJim InghamStopInfo::GetReturnValueObject(StopInfoSP &stop_info_sp) 11351586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham{ 11361586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham if (stop_info_sp && stop_info_sp->GetStopReason() == eStopReasonPlanComplete) 11371586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham { 11381586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham StopInfoThreadPlan *plan_stop_info = static_cast<StopInfoThreadPlan *>(stop_info_sp.get()); 11391586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham return plan_stop_info->GetReturnValueObject(); 11401586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham } 11411586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham else 11421586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham return ValueObjectSP(); 11431586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham} 1144