From f2f3b1a87ad294433986683864f75575c3a81779 Mon Sep 17 00:00:00 2001 From: Alex Langford Date: Fri, 16 Dec 2022 14:29:11 -0800 Subject: [PATCH] [lldb] Do not deallocate memory after exec After an exec has occured, resources used to manage the state of a Process are cleaned up. One such resource is the AllocatedMemoryCache which keeps track of memory allocations made in the process for things like expression evaluation. After an exec is performed, the allocated memory regions in the process are gone, so it does not make sense to try to deallocate those regions. rdar://103188106 Differential Revision: https://reviews.llvm.org/D140249 --- lldb/include/lldb/Target/Memory.h | 2 +- lldb/source/Target/Memory.cpp | 4 ++-- lldb/source/Target/Process.cpp | 6 ++++-- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/lldb/include/lldb/Target/Memory.h b/lldb/include/lldb/Target/Memory.h index b3ad22a..8c564e8 100644 --- a/lldb/include/lldb/Target/Memory.h +++ b/lldb/include/lldb/Target/Memory.h @@ -116,7 +116,7 @@ public: ~AllocatedMemoryCache(); - void Clear(); + void Clear(bool deallocate_memory); lldb::addr_t AllocateMemory(size_t byte_size, uint32_t permissions, Status &error); diff --git a/lldb/source/Target/Memory.cpp b/lldb/source/Target/Memory.cpp index a07a72f..d4dedee 100644 --- a/lldb/source/Target/Memory.cpp +++ b/lldb/source/Target/Memory.cpp @@ -332,9 +332,9 @@ AllocatedMemoryCache::AllocatedMemoryCache(Process &process) AllocatedMemoryCache::~AllocatedMemoryCache() = default; -void AllocatedMemoryCache::Clear() { +void AllocatedMemoryCache::Clear(bool deallocate_memory) { std::lock_guard guard(m_mutex); - if (m_process.IsAlive()) { + if (m_process.IsAlive() && deallocate_memory) { PermissionsToBlockMap::iterator pos, end = m_memory_map.end(); for (pos = m_memory_map.begin(); pos != end; ++pos) m_process.DoDeallocateMemory(pos->second->GetBaseAddress()); diff --git a/lldb/source/Target/Process.cpp b/lldb/source/Target/Process.cpp index 1abe12f..e0cca05 100644 --- a/lldb/source/Target/Process.cpp +++ b/lldb/source/Target/Process.cpp @@ -543,7 +543,7 @@ void Process::Finalize() { m_notifications.swap(empty_notifications); m_image_tokens.clear(); m_memory_cache.Clear(); - m_allocated_memory_cache.Clear(); + m_allocated_memory_cache.Clear(/*deallocate_memory=*/true); { std::lock_guard guard(m_language_runtimes_mutex); m_language_runtimes.clear(); @@ -5657,7 +5657,9 @@ void Process::DidExec() { m_dyld_up.reset(); m_jit_loaders_up.reset(); m_image_tokens.clear(); - m_allocated_memory_cache.Clear(); + // After an exec, the inferior is a new process and these memory regions are + // no longer allocated. + m_allocated_memory_cache.Clear(/*deallocte_memory=*/false); { std::lock_guard guard(m_language_runtimes_mutex); m_language_runtimes.clear(); -- 2.7.4