[Lldb-commits] [lldb] r246488 - Stop objects from keeping a strong reference to the process when they should have a weak reference.
Greg Clayton via lldb-commits
lldb-commits at lists.llvm.org
Mon Aug 31 14:25:45 PDT 2015
Author: gclayton
Date: Mon Aug 31 16:25:45 2015
New Revision: 246488
URL: http://llvm.org/viewvc/llvm-project?rev=246488&view=rev
Log:
Stop objects from keeping a strong reference to the process when they should have a weak reference.
Modified:
lldb/trunk/source/Plugins/InstrumentationRuntime/AddressSanitizer/AddressSanitizerRuntime.cpp
lldb/trunk/source/Plugins/InstrumentationRuntime/AddressSanitizer/AddressSanitizerRuntime.h
lldb/trunk/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCTrampolineHandler.cpp
lldb/trunk/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCTrampolineHandler.h
lldb/trunk/source/Plugins/MemoryHistory/asan/MemoryHistoryASan.cpp
lldb/trunk/source/Plugins/MemoryHistory/asan/MemoryHistoryASan.h
Modified: lldb/trunk/source/Plugins/InstrumentationRuntime/AddressSanitizer/AddressSanitizerRuntime.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/InstrumentationRuntime/AddressSanitizer/AddressSanitizerRuntime.cpp?rev=246488&r1=246487&r2=246488&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/InstrumentationRuntime/AddressSanitizer/AddressSanitizerRuntime.cpp (original)
+++ lldb/trunk/source/Plugins/InstrumentationRuntime/AddressSanitizer/AddressSanitizerRuntime.cpp Mon Aug 31 16:25:45 2015
@@ -66,9 +66,11 @@ AddressSanitizerRuntime::GetTypeStatic()
AddressSanitizerRuntime::AddressSanitizerRuntime(const ProcessSP &process_sp) :
m_is_active(false),
m_runtime_module(),
- m_process(process_sp),
+ m_process_wp(),
m_breakpoint_id(0)
{
+ if (process_sp)
+ m_process_wp = process_sp;
}
AddressSanitizerRuntime::~AddressSanitizerRuntime()
@@ -161,7 +163,11 @@ t
StructuredData::ObjectSP
AddressSanitizerRuntime::RetrieveReportData()
{
- ThreadSP thread_sp = m_process->GetThreadList().GetSelectedThread();
+ ProcessSP process_sp = GetProcessSP();
+ if (!process_sp)
+ return StructuredData::ObjectSP();
+
+ ThreadSP thread_sp = process_sp->GetThreadList().GetSelectedThread();
StackFrameSP frame_sp = thread_sp->GetSelectedFrame();
if (!frame_sp)
@@ -175,7 +181,7 @@ AddressSanitizerRuntime::RetrieveReportD
options.SetTimeoutUsec(RETRIEVE_REPORT_DATA_FUNCTION_TIMEOUT_USEC);
ValueObjectSP return_value_sp;
- if (m_process->GetTarget().EvaluateExpression(address_sanitizer_retrieve_report_data_command, frame_sp.get(), return_value_sp, options) != eExpressionCompleted)
+ if (process_sp->GetTarget().EvaluateExpression(address_sanitizer_retrieve_report_data_command, frame_sp.get(), return_value_sp, options) != eExpressionCompleted)
return StructuredData::ObjectSP();
int present = return_value_sp->GetValueForExpressionPath(".present")->GetValueAsUnsigned(0);
@@ -193,7 +199,7 @@ AddressSanitizerRuntime::RetrieveReportD
addr_t description_ptr = return_value_sp->GetValueForExpressionPath(".description")->GetValueAsUnsigned(0);
std::string description;
Error error;
- m_process->ReadCStringFromMemory(description_ptr, description, error);
+ process_sp->ReadCStringFromMemory(description_ptr, description, error);
StructuredData::Dictionary *dict = new StructuredData::Dictionary();
dict->AddStringItem("instrumentation_class", "AddressSanitizer");
@@ -249,27 +255,31 @@ AddressSanitizerRuntime::NotifyBreakpoin
assert (baton && "null baton");
if (!baton)
return false;
-
+
AddressSanitizerRuntime *const instance = static_cast<AddressSanitizerRuntime*>(baton);
-
+
StructuredData::ObjectSP report = instance->RetrieveReportData();
std::string description;
if (report) {
description = instance->FormatDescription(report);
}
- ThreadSP thread = context->exe_ctx_ref.GetThreadSP();
- thread->SetStopInfo(InstrumentationRuntimeStopInfo::CreateStopReasonWithInstrumentationData(*thread, description.c_str(), report));
-
- if (instance->m_process)
+ ProcessSP process_sp = instance->GetProcessSP();
+ // Make sure this is the right process
+ if (process_sp && process_sp == context->exe_ctx_ref.GetProcessSP())
{
- StreamFileSP stream_sp (instance->m_process->GetTarget().GetDebugger().GetOutputFile());
+ ThreadSP thread_sp = context->exe_ctx_ref.GetThreadSP();
+ if (thread_sp)
+ thread_sp->SetStopInfo(InstrumentationRuntimeStopInfo::CreateStopReasonWithInstrumentationData(*thread_sp, description.c_str(), report));
+
+ StreamFileSP stream_sp (process_sp->GetTarget().GetDebugger().GetOutputFile());
if (stream_sp)
{
stream_sp->Printf ("AddressSanitizer report breakpoint hit. Use 'thread info -s' to get extended information about the report.\n");
}
+ return true; // Return true to stop the target
}
- // Return true to stop the target, false to just let the target run.
- return true;
+ else
+ return false; // Let target run
}
void
@@ -278,6 +288,10 @@ AddressSanitizerRuntime::Activate()
if (m_is_active)
return;
+ ProcessSP process_sp = GetProcessSP();
+ if (!process_sp)
+ return;
+
ConstString symbol_name ("__asan::AsanDie()");
const Symbol *symbol = m_runtime_module->FindFirstSymbolWithNameAndType (symbol_name, eSymbolTypeCode);
@@ -287,7 +301,7 @@ AddressSanitizerRuntime::Activate()
if (!symbol->ValueIsAddress() || !symbol->GetAddressRef().IsValid())
return;
- Target &target = m_process->GetTarget();
+ Target &target = process_sp->GetTarget();
addr_t symbol_address = symbol->GetAddressRef().GetOpcodeLoadAddress(&target);
if (symbol_address == LLDB_INVALID_ADDRESS)
@@ -295,18 +309,15 @@ AddressSanitizerRuntime::Activate()
bool internal = true;
bool hardware = false;
- Breakpoint *breakpoint = m_process->GetTarget().CreateBreakpoint(symbol_address, internal, hardware).get();
+ Breakpoint *breakpoint = process_sp->GetTarget().CreateBreakpoint(symbol_address, internal, hardware).get();
breakpoint->SetCallback (AddressSanitizerRuntime::NotifyBreakpointHit, this, true);
breakpoint->SetBreakpointKind ("address-sanitizer-report");
m_breakpoint_id = breakpoint->GetID();
- if (m_process)
+ StreamFileSP stream_sp (process_sp->GetTarget().GetDebugger().GetOutputFile());
+ if (stream_sp)
{
- StreamFileSP stream_sp (m_process->GetTarget().GetDebugger().GetOutputFile());
- if (stream_sp)
- {
- stream_sp->Printf ("AddressSanitizer debugger support is active. Memory error breakpoint has been installed and you can now use the 'memory history' command.\n");
- }
+ stream_sp->Printf ("AddressSanitizer debugger support is active. Memory error breakpoint has been installed and you can now use the 'memory history' command.\n");
}
m_is_active = true;
@@ -317,8 +328,12 @@ AddressSanitizerRuntime::Deactivate()
{
if (m_breakpoint_id != LLDB_INVALID_BREAK_ID)
{
- m_process->GetTarget().RemoveBreakpointByID(m_breakpoint_id);
- m_breakpoint_id = LLDB_INVALID_BREAK_ID;
+ ProcessSP process_sp = GetProcessSP();
+ if (process_sp)
+ {
+ process_sp->GetTarget().RemoveBreakpointByID(m_breakpoint_id);
+ m_breakpoint_id = LLDB_INVALID_BREAK_ID;
+ }
}
m_is_active = false;
}
Modified: lldb/trunk/source/Plugins/InstrumentationRuntime/AddressSanitizer/AddressSanitizerRuntime.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/InstrumentationRuntime/AddressSanitizer/AddressSanitizerRuntime.h?rev=246488&r1=246487&r2=246488&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/InstrumentationRuntime/AddressSanitizer/AddressSanitizerRuntime.h (original)
+++ lldb/trunk/source/Plugins/InstrumentationRuntime/AddressSanitizer/AddressSanitizerRuntime.h Mon Aug 31 16:25:45 2015
@@ -56,7 +56,13 @@ public:
IsActive();
private:
-
+
+ lldb::ProcessSP
+ GetProcessSP ()
+ {
+ return m_process_wp.lock();
+ }
+
AddressSanitizerRuntime(const lldb::ProcessSP &process_sp);
void
@@ -76,7 +82,7 @@ private:
bool m_is_active;
lldb::ModuleSP m_runtime_module;
- lldb::ProcessSP m_process;
+ lldb::ProcessWP m_process_wp;
lldb::user_id_t m_breakpoint_id;
};
Modified: lldb/trunk/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCTrampolineHandler.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCTrampolineHandler.cpp?rev=246488&r1=246487&r2=246488&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCTrampolineHandler.cpp (original)
+++ lldb/trunk/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCTrampolineHandler.cpp Mon Aug 31 16:25:45 2015
@@ -294,13 +294,15 @@ AppleObjCTrampolineHandler::AppleObjCVTa
// First read in the header:
char memory_buffer[16];
- Process *process = m_owner->GetProcess();
+ ProcessSP process_sp = m_owner->GetProcessSP();
+ if (!process_sp)
+ return;
DataExtractor data(memory_buffer, sizeof(memory_buffer),
- process->GetByteOrder(),
- process->GetAddressByteSize());
- size_t actual_size = 8 + process->GetAddressByteSize();
+ process_sp->GetByteOrder(),
+ process_sp->GetAddressByteSize());
+ size_t actual_size = 8 + process_sp->GetAddressByteSize();
Error error;
- size_t bytes_read = process->ReadMemory (m_header_addr, memory_buffer, actual_size, error);
+ size_t bytes_read = process_sp->ReadMemory (m_header_addr, memory_buffer, actual_size, error);
if (bytes_read != actual_size)
{
m_valid = false;
@@ -340,9 +342,9 @@ AppleObjCTrampolineHandler::AppleObjCVTa
uint8_t* dst = (uint8_t*)data_sp->GetBytes();
DataExtractor desc_extractor (dst, desc_array_size,
- process->GetByteOrder(),
- process->GetAddressByteSize());
- bytes_read = process->ReadMemory(desc_ptr, dst, desc_array_size, error);
+ process_sp->GetByteOrder(),
+ process_sp->GetAddressByteSize());
+ bytes_read = process_sp->ReadMemory(desc_ptr, dst, desc_array_size, error);
if (bytes_read != desc_array_size)
{
m_valid = false;
@@ -428,79 +430,88 @@ AppleObjCTrampolineHandler::AppleObjCVTa
AppleObjCTrampolineHandler::AppleObjCVTables::AppleObjCVTables (const ProcessSP &process_sp,
const ModuleSP &objc_module_sp) :
- m_process_sp (process_sp),
+ m_process_wp (),
m_trampoline_header (LLDB_INVALID_ADDRESS),
m_trampolines_changed_bp_id (LLDB_INVALID_BREAK_ID),
m_objc_module_sp (objc_module_sp)
{
-
+ if (process_sp)
+ m_process_wp = process_sp;
}
AppleObjCTrampolineHandler::AppleObjCVTables::~AppleObjCVTables()
{
- if (m_trampolines_changed_bp_id != LLDB_INVALID_BREAK_ID)
- m_process_sp->GetTarget().RemoveBreakpointByID (m_trampolines_changed_bp_id);
+ ProcessSP process_sp = GetProcessSP ();
+ if (process_sp)
+ {
+ if (m_trampolines_changed_bp_id != LLDB_INVALID_BREAK_ID)
+ process_sp->GetTarget().RemoveBreakpointByID (m_trampolines_changed_bp_id);
+ }
}
-
+
bool
AppleObjCTrampolineHandler::AppleObjCVTables::InitializeVTableSymbols ()
{
if (m_trampoline_header != LLDB_INVALID_ADDRESS)
return true;
- Target &target = m_process_sp->GetTarget();
-
- const ModuleList &target_modules = target.GetImages();
- Mutex::Locker modules_locker(target_modules.GetMutex());
- size_t num_modules = target_modules.GetSize();
- if (!m_objc_module_sp)
+
+ ProcessSP process_sp = GetProcessSP ();
+ if (process_sp)
{
- for (size_t i = 0; i < num_modules; i++)
+ Target &target = process_sp->GetTarget();
+
+ const ModuleList &target_modules = target.GetImages();
+ Mutex::Locker modules_locker(target_modules.GetMutex());
+ size_t num_modules = target_modules.GetSize();
+ if (!m_objc_module_sp)
{
- if (m_process_sp->GetObjCLanguageRuntime()->IsModuleObjCLibrary (target_modules.GetModuleAtIndexUnlocked(i)))
+ for (size_t i = 0; i < num_modules; i++)
{
- m_objc_module_sp = target_modules.GetModuleAtIndexUnlocked(i);
- break;
+ if (process_sp->GetObjCLanguageRuntime()->IsModuleObjCLibrary (target_modules.GetModuleAtIndexUnlocked(i)))
+ {
+ m_objc_module_sp = target_modules.GetModuleAtIndexUnlocked(i);
+ break;
+ }
}
}
- }
-
- if (m_objc_module_sp)
- {
- ConstString trampoline_name ("gdb_objc_trampolines");
- const Symbol *trampoline_symbol = m_objc_module_sp->FindFirstSymbolWithNameAndType (trampoline_name,
- eSymbolTypeData);
- if (trampoline_symbol != NULL)
+
+ if (m_objc_module_sp)
{
- m_trampoline_header = trampoline_symbol->GetLoadAddress(&target);
- if (m_trampoline_header == LLDB_INVALID_ADDRESS)
- return false;
-
- // Next look up the "changed" symbol and set a breakpoint on that...
- ConstString changed_name ("gdb_objc_trampolines_changed");
- const Symbol *changed_symbol = m_objc_module_sp->FindFirstSymbolWithNameAndType (changed_name,
- eSymbolTypeCode);
- if (changed_symbol != NULL)
+ ConstString trampoline_name ("gdb_objc_trampolines");
+ const Symbol *trampoline_symbol = m_objc_module_sp->FindFirstSymbolWithNameAndType (trampoline_name,
+ eSymbolTypeData);
+ if (trampoline_symbol != NULL)
{
- const Address changed_symbol_addr = changed_symbol->GetAddress();
- if (!changed_symbol_addr.IsValid())
+ m_trampoline_header = trampoline_symbol->GetLoadAddress(&target);
+ if (m_trampoline_header == LLDB_INVALID_ADDRESS)
return false;
-
- lldb::addr_t changed_addr = changed_symbol_addr.GetOpcodeLoadAddress (&target);
- if (changed_addr != LLDB_INVALID_ADDRESS)
+
+ // Next look up the "changed" symbol and set a breakpoint on that...
+ ConstString changed_name ("gdb_objc_trampolines_changed");
+ const Symbol *changed_symbol = m_objc_module_sp->FindFirstSymbolWithNameAndType (changed_name,
+ eSymbolTypeCode);
+ if (changed_symbol != NULL)
{
- BreakpointSP trampolines_changed_bp_sp = target.CreateBreakpoint (changed_addr, true, false);
- if (trampolines_changed_bp_sp)
+ const Address changed_symbol_addr = changed_symbol->GetAddress();
+ if (!changed_symbol_addr.IsValid())
+ return false;
+
+ lldb::addr_t changed_addr = changed_symbol_addr.GetOpcodeLoadAddress (&target);
+ if (changed_addr != LLDB_INVALID_ADDRESS)
{
- m_trampolines_changed_bp_id = trampolines_changed_bp_sp->GetID();
- trampolines_changed_bp_sp->SetCallback (RefreshTrampolines, this, true);
- trampolines_changed_bp_sp->SetBreakpointKind ("objc-trampolines-changed");
- return true;
+ BreakpointSP trampolines_changed_bp_sp = target.CreateBreakpoint (changed_addr, true, false);
+ if (trampolines_changed_bp_sp)
+ {
+ m_trampolines_changed_bp_id = trampolines_changed_bp_sp->GetID();
+ trampolines_changed_bp_sp->SetCallback (RefreshTrampolines, this, true);
+ trampolines_changed_bp_sp->SetBreakpointKind ("objc-trampolines-changed");
+ return true;
+ }
}
}
}
}
}
-
return false;
}
@@ -559,16 +570,21 @@ AppleObjCTrampolineHandler::AppleObjCVTa
if (!InitializeVTableSymbols())
return false;
Error error;
- lldb::addr_t region_addr = m_process_sp->ReadPointerFromMemory (m_trampoline_header, error);
- if (error.Success())
- return ReadRegions (region_addr);
+ ProcessSP process_sp = GetProcessSP ();
+ if (process_sp)
+ {
+ lldb::addr_t region_addr = process_sp->ReadPointerFromMemory (m_trampoline_header, error);
+ if (error.Success())
+ return ReadRegions (region_addr);
+ }
return false;
}
bool
AppleObjCTrampolineHandler::AppleObjCVTables::ReadRegions (lldb::addr_t region_addr)
{
- if (!m_process_sp)
+ ProcessSP process_sp = GetProcessSP ();
+ if (!process_sp)
return false;
Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP));
@@ -639,12 +655,14 @@ AppleObjCTrampolineHandler::g_dispatch_f
AppleObjCTrampolineHandler::AppleObjCTrampolineHandler (const ProcessSP &process_sp,
const ModuleSP &objc_module_sp) :
- m_process_sp (process_sp),
+ m_process_wp (),
m_objc_module_sp (objc_module_sp),
m_impl_fn_addr (LLDB_INVALID_ADDRESS),
m_impl_stret_fn_addr (LLDB_INVALID_ADDRESS),
m_msg_forward_addr (LLDB_INVALID_ADDRESS)
{
+ if (process_sp)
+ m_process_wp = process_sp;
// Look up the known resolution functions:
ConstString get_impl_name("class_getMethodImplementation");
@@ -652,7 +670,7 @@ AppleObjCTrampolineHandler::AppleObjCTra
ConstString msg_forward_name("_objc_msgForward");
ConstString msg_forward_stret_name("_objc_msgForward_stret");
- Target *target = m_process_sp ? &m_process_sp->GetTarget() : NULL;
+ Target *target = process_sp ? &process_sp->GetTarget() : NULL;
const Symbol *class_getMethodImplementation = m_objc_module_sp->FindFirstSymbolWithNameAndType (get_impl_name, eSymbolTypeCode);
const Symbol *class_getMethodImplementation_stret = m_objc_module_sp->FindFirstSymbolWithNameAndType (get_impl_stret_name, eSymbolTypeCode);
const Symbol *msg_forward = m_objc_module_sp->FindFirstSymbolWithNameAndType (msg_forward_name, eSymbolTypeCode);
@@ -1041,7 +1059,7 @@ AppleObjCTrampolineHandler::GetStepThrou
log->Printf("Resolving call for class - 0x%" PRIx64 " and selector - 0x%" PRIx64,
isa_addr, sel_addr);
}
- ObjCLanguageRuntime *objc_runtime = m_process_sp->GetObjCLanguageRuntime ();
+ ObjCLanguageRuntime *objc_runtime = thread.GetProcess()->GetObjCLanguageRuntime ();
assert(objc_runtime != NULL);
impl_addr = objc_runtime->LookupInMethodCache (isa_addr, sel_addr);
Modified: lldb/trunk/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCTrampolineHandler.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCTrampolineHandler.h?rev=246488&r1=246487&r2=246488&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCTrampolineHandler.h (original)
+++ lldb/trunk/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCTrampolineHandler.h Mon Aug 31 16:25:45 2015
@@ -176,13 +176,14 @@ private:
bool
IsAddressInVTables (lldb::addr_t addr, uint32_t &flags);
- Process *GetProcess ()
+ lldb::ProcessSP
+ GetProcessSP ()
{
- return m_process_sp.get();
+ return m_process_wp.lock();
}
private:
- lldb::ProcessSP m_process_sp;
+ lldb::ProcessWP m_process_wp;
typedef std::vector<VTableRegion> region_collection;
lldb::addr_t m_trampoline_header;
lldb::break_id_t m_trampolines_changed_bp_id;
@@ -195,7 +196,7 @@ private:
typedef std::map<lldb::addr_t, int> MsgsendMap; // This table maps an dispatch fn address to the index in g_dispatch_functions
MsgsendMap m_msgSend_map;
- lldb::ProcessSP m_process_sp;
+ lldb::ProcessWP m_process_wp;
lldb::ModuleSP m_objc_module_sp;
std::unique_ptr<ClangFunction> m_impl_function;
std::unique_ptr<ClangUtilityFunction> m_impl_code;
Modified: lldb/trunk/source/Plugins/MemoryHistory/asan/MemoryHistoryASan.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/MemoryHistory/asan/MemoryHistoryASan.cpp?rev=246488&r1=246487&r2=246488&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/MemoryHistory/asan/MemoryHistoryASan.cpp (original)
+++ lldb/trunk/source/Plugins/MemoryHistory/asan/MemoryHistoryASan.cpp Mon Aug 31 16:25:45 2015
@@ -75,7 +75,8 @@ MemoryHistoryASan::GetPluginNameStatic()
MemoryHistoryASan::MemoryHistoryASan(const ProcessSP &process_sp)
{
- this->m_process_sp = process_sp;
+ if (process_sp)
+ m_process_wp = process_sp;
}
const char *
@@ -133,40 +134,41 @@ static void CreateHistoryThreadFromValue
HistoryThreads
MemoryHistoryASan::GetHistoryThreads(lldb::addr_t address)
{
- ProcessSP process_sp = m_process_sp;
- ThreadSP thread_sp = m_process_sp->GetThreadList().GetSelectedThread();
- StackFrameSP frame_sp = thread_sp->GetSelectedFrame();
+ HistoryThreads result;
- if (!frame_sp)
+ ProcessSP process_sp = m_process_wp.lock();
+ if (process_sp)
{
- return HistoryThreads();
- }
-
- ExecutionContext exe_ctx (frame_sp);
- ValueObjectSP return_value_sp;
- StreamString expr;
- expr.Printf(memory_history_asan_command_format, address, address);
-
- EvaluateExpressionOptions options;
- options.SetUnwindOnError(true);
- options.SetTryAllThreads(true);
- options.SetStopOthers(true);
- options.SetIgnoreBreakpoints(true);
- options.SetTimeoutUsec(GET_STACK_FUNCTION_TIMEOUT_USEC);
+ ThreadSP thread_sp = process_sp->GetThreadList().GetSelectedThread();
- if (m_process_sp->GetTarget().EvaluateExpression(expr.GetData(), frame_sp.get(), return_value_sp, options) != eExpressionCompleted)
- {
- return HistoryThreads();
+ if (thread_sp)
+ {
+ StackFrameSP frame_sp = thread_sp->GetSelectedFrame();
+
+ if (frame_sp)
+ {
+ ExecutionContext exe_ctx (frame_sp);
+ ValueObjectSP return_value_sp;
+ StreamString expr;
+ expr.Printf(memory_history_asan_command_format, address, address);
+
+ EvaluateExpressionOptions options;
+ options.SetUnwindOnError(true);
+ options.SetTryAllThreads(true);
+ options.SetStopOthers(true);
+ options.SetIgnoreBreakpoints(true);
+ options.SetTimeoutUsec(GET_STACK_FUNCTION_TIMEOUT_USEC);
+
+ if (process_sp->GetTarget().EvaluateExpression(expr.GetData(), frame_sp.get(), return_value_sp, options) == eExpressionCompleted)
+ {
+ if (return_value_sp)
+ {
+ CreateHistoryThreadFromValueObject(process_sp, return_value_sp, "free", "Memory deallocated at", result);
+ CreateHistoryThreadFromValueObject(process_sp, return_value_sp, "alloc", "Memory allocated at", result);
+ }
+ }
+ }
+ }
}
- if (!return_value_sp)
- {
- return HistoryThreads();
- }
-
- HistoryThreads result;
-
- CreateHistoryThreadFromValueObject(process_sp, return_value_sp, "free", "Memory deallocated at", result);
- CreateHistoryThreadFromValueObject(process_sp, return_value_sp, "alloc", "Memory allocated at", result);
-
return result;
}
Modified: lldb/trunk/source/Plugins/MemoryHistory/asan/MemoryHistoryASan.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/MemoryHistory/asan/MemoryHistoryASan.h?rev=246488&r1=246487&r2=246488&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/MemoryHistory/asan/MemoryHistoryASan.h (original)
+++ lldb/trunk/source/Plugins/MemoryHistory/asan/MemoryHistoryASan.h Mon Aug 31 16:25:45 2015
@@ -53,7 +53,7 @@ private:
MemoryHistoryASan(const lldb::ProcessSP &process_sp);
- lldb::ProcessSP m_process_sp;
+ lldb::ProcessWP m_process_wp;
};
More information about the lldb-commits
mailing list