Thread hardening part 3. Now lldb_private::Thread objects have std::weak_ptr
objects for the backlink to the lldb_private::Process. The issues we were
running into before was someone was holding onto a shared pointer to a
lldb_private::Thread for too long, and the lldb_private::Process parent object
would get destroyed and the lldb_private::Thread had a "Process &m_process"
member which would just treat whatever memory that used to be a Process as a
valid Process. This was mostly happening for lldb_private::StackFrame objects
that had a member like "Thread &m_thread". So this completes the internal
strong/weak changes.
Documented the ExecutionContext and ExecutionContextRef classes so that our
LLDB developers can understand when and where to use ExecutionContext and
ExecutionContextRef objects.
git-svn-id: https://llvm.org/svn/llvm-project/lldb/trunk@151009 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/source/Target/ThreadPlanCallFunction.cpp b/source/Target/ThreadPlanCallFunction.cpp
index a518061..09bdd3d 100644
--- a/source/Target/ThreadPlanCallFunction.cpp
+++ b/source/Target/ThreadPlanCallFunction.cpp
@@ -54,20 +54,24 @@
{
SetOkayToDiscard (discard_on_error);
- Process& process = thread.GetProcess();
- Target& target = process.GetTarget();
- const ABI *abi = process.GetABI().get();
+ ProcessSP process_sp (thread.GetProcess());
+ if (!process_sp)
+ return;
+
+ const ABI *abi = process_sp->GetABI().get();
if (!abi)
return;
+ TargetSP target_sp (thread.CalculateTarget());
+
LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP));
SetBreakpoints();
m_function_sp = thread.GetRegisterContext()->GetSP() - abi->GetRedZoneSize();
- Module *exe_module = target.GetExecutableModulePointer();
+ Module *exe_module = target_sp->GetExecutableModulePointer();
if (exe_module == NULL)
{
@@ -95,7 +99,7 @@
}
}
- addr_t start_load_addr = m_start_addr.GetLoadAddress(&target);
+ addr_t start_load_addr = m_start_addr.GetLoadAddress (target_sp.get());
// Checkpoint the thread state so we can restore it later.
if (log && log->GetVerbose())
@@ -110,7 +114,7 @@
// Now set the thread state to "no reason" so we don't run with whatever signal was outstanding...
thread.SetStopInfoToNothing();
- addr_t FunctionLoadAddr = m_function_addr.GetLoadAddress(&target);
+ addr_t FunctionLoadAddr = m_function_addr.GetLoadAddress (target_sp.get());
if (this_arg && cmd_arg)
{
@@ -170,20 +174,24 @@
{
SetOkayToDiscard (discard_on_error);
- Process& process = thread.GetProcess();
- Target& target = process.GetTarget();
- const ABI *abi = process.GetABI().get();
+ ProcessSP process_sp (thread.GetProcess());
+ if (!process_sp)
+ return;
+
+ const ABI *abi = process_sp->GetABI().get();
if (!abi)
return;
-
+
+ TargetSP target_sp (thread.CalculateTarget());
+
LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP));
SetBreakpoints();
m_function_sp = thread.GetRegisterContext()->GetSP() - abi->GetRedZoneSize();
- Module *exe_module = target.GetExecutableModulePointer();
+ Module *exe_module = target_sp->GetExecutableModulePointer();
if (exe_module == NULL)
{
@@ -211,7 +219,7 @@
}
}
- addr_t start_load_addr = m_start_addr.GetLoadAddress(&target);
+ addr_t start_load_addr = m_start_addr.GetLoadAddress(target_sp.get());
// Checkpoint the thread state so we can restore it later.
if (log && log->GetVerbose())
@@ -226,7 +234,7 @@
// Now set the thread state to "no reason" so we don't run with whatever signal was outstanding...
thread.SetStopInfoToNothing();
- addr_t FunctionLoadAddr = m_function_addr.GetLoadAddress(&target);
+ addr_t FunctionLoadAddr = m_function_addr.GetLoadAddress(target_sp.get());
if (!abi->PrepareTrivialCall (thread,
m_function_sp,
@@ -285,7 +293,8 @@
LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP));
if (!m_takedown_done)
{
- const ABI *abi = m_thread.GetProcess().GetABI().get();
+ ProcessSP process_sp (m_thread.GetProcess());
+ const ABI *abi = process_sp ? process_sp->GetABI().get() : NULL;
if (abi && m_return_type.IsValid())
{
m_return_valobj_sp = abi->GetReturnValueObject (m_thread, m_return_type);
@@ -325,7 +334,8 @@
}
else
{
- s->Printf("Thread plan to call 0x%llx", m_function_addr.GetLoadAddress(&m_thread.GetProcess().GetTarget()));
+ TargetSP target_sp (m_thread.CalculateTarget());
+ s->Printf("Thread plan to call 0x%llx", m_function_addr.GetLoadAddress(target_sp.get()));
}
}
@@ -362,8 +372,11 @@
if (m_real_stop_info_sp && m_real_stop_info_sp->GetStopReason() == eStopReasonBreakpoint)
{
+ ProcessSP process_sp (m_thread.CalculateProcess());
uint64_t break_site_id = m_real_stop_info_sp->GetValue();
- BreakpointSiteSP bp_site_sp = m_thread.GetProcess().GetBreakpointSiteList().FindByID(break_site_id);
+ BreakpointSiteSP bp_site_sp;
+ if (process_sp)
+ bp_site_sp = process_sp->GetBreakpointSiteList().FindByID(break_site_id);
if (bp_site_sp)
{
uint32_t num_owners = bp_site_sp->GetNumberOfOwners();
@@ -475,13 +488,17 @@
void
ThreadPlanCallFunction::SetBreakpoints ()
{
- m_cxx_language_runtime = m_thread.GetProcess().GetLanguageRuntime(eLanguageTypeC_plus_plus);
- m_objc_language_runtime = m_thread.GetProcess().GetLanguageRuntime(eLanguageTypeObjC);
+ ProcessSP process_sp (m_thread.CalculateProcess());
+ if (process_sp)
+ {
+ m_cxx_language_runtime = process_sp->GetLanguageRuntime(eLanguageTypeC_plus_plus);
+ m_objc_language_runtime = process_sp->GetLanguageRuntime(eLanguageTypeObjC);
- if (m_cxx_language_runtime)
- m_cxx_language_runtime->SetExceptionBreakpoints();
- if (m_objc_language_runtime)
- m_objc_language_runtime->SetExceptionBreakpoints();
+ if (m_cxx_language_runtime)
+ m_cxx_language_runtime->SetExceptionBreakpoints();
+ if (m_objc_language_runtime)
+ m_objc_language_runtime->SetExceptionBreakpoints();
+ }
}
void