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
~AllocatedMemoryCache();
- void Clear();
+ void Clear(bool deallocate_memory);
lldb::addr_t AllocateMemory(size_t byte_size, uint32_t permissions,
Status &error);
AllocatedMemoryCache::~AllocatedMemoryCache() = default;
-void AllocatedMemoryCache::Clear() {
+void AllocatedMemoryCache::Clear(bool deallocate_memory) {
std::lock_guard<std::recursive_mutex> 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());
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<std::recursive_mutex> guard(m_language_runtimes_mutex);
m_language_runtimes.clear();
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<std::recursive_mutex> guard(m_language_runtimes_mutex);
m_language_runtimes.clear();