[Lldb-commits] [lldb] [Minidump] Update Minidump file builder to continue when the Module's section cannot be found (PR #152009)
via lldb-commits
lldb-commits at lists.llvm.org
Mon Aug 4 10:53:31 PDT 2025
https://github.com/barsolo2000 created https://github.com/llvm/llvm-project/pull/152009
Instead of returning an error when:
- it can't obtain section information from a module.
- there are other issues calculating the size.
Instead, when we encounter such an error we log the error and continue with the other modules.
tested with lldb/test/API/functionalities/process_save_core_minidump/TestProcessSaveCoreMinidump.py
>From 91ad83c794eeaed56297aa43a6d36e8c7572e18e Mon Sep 17 00:00:00 2001
From: Bar Soloveychik <barsolo at fb.com>
Date: Mon, 4 Aug 2025 10:13:37 -0700
Subject: [PATCH 1/3] Update Minidump file builder to continue when the
Module's section cannot be found
---
.../Minidump/MinidumpFileBuilder.cpp | 55 +++++++++++--------
1 file changed, 32 insertions(+), 23 deletions(-)
diff --git a/lldb/source/Plugins/ObjectFile/Minidump/MinidumpFileBuilder.cpp b/lldb/source/Plugins/ObjectFile/Minidump/MinidumpFileBuilder.cpp
index 25e98882c20c9..aa42ed30a8e09 100644
--- a/lldb/source/Plugins/ObjectFile/Minidump/MinidumpFileBuilder.cpp
+++ b/lldb/source/Plugins/ObjectFile/Minidump/MinidumpFileBuilder.cpp
@@ -308,38 +308,49 @@ Status MinidumpFileBuilder::AddModuleList() {
// the llvm::minidump::Module's structures into helper data
size_t size_before = GetCurrentDataEndOffset();
- // This is the size of the main part of the ModuleList stream.
- // It consists of a module number and corresponding number of
- // structs describing individual modules
- size_t module_stream_size =
- sizeof(llvm::support::ulittle32_t) + modules_count * minidump_module_size;
-
- // Adding directory describing this stream.
- error = AddDirectory(StreamType::ModuleList, module_stream_size);
- if (error.Fail())
- return error;
-
- m_data.AppendData(&modules_count, sizeof(llvm::support::ulittle32_t));
-
// Temporary storage for the helper data (of variable length)
// as these cannot be dumped to m_data before dumping entire
// array of module structures.
DataBufferHeap helper_data;
+ // Track the count of successfully processed modules and log errors.
+ uint32_t successful_modules_count = 0;
for (size_t i = 0; i < modules_count; ++i) {
ModuleSP mod = modules.GetModuleAtIndex(i);
std::string module_name = mod->GetSpecificationDescription();
auto maybe_mod_size = getModuleFileSize(target, mod);
if (!maybe_mod_size) {
llvm::Error mod_size_err = maybe_mod_size.takeError();
- llvm::handleAllErrors(std::move(mod_size_err),
- [&](const llvm::ErrorInfoBase &E) {
- error = Status::FromErrorStringWithFormat(
- "Unable to get the size of module %s: %s.",
- module_name.c_str(), E.message().c_str());
- });
- return error;
+ Log *log = GetLog(LLDBLog::Object);
+ llvm::handleAllErrors(
+ std::move(mod_size_err), [&](const llvm::ErrorInfoBase &E) {
+ if (log) {
+ LLDB_LOG_ERROR(log, llvm::ErrorSuccess(),
+ "Unable to get the size of module {}: {}",
+ module_name, E.message());
+ }
+ });
+ } else {
+ ++successful_modules_count;
}
+ }
+
+ size_t module_stream_size = sizeof(llvm::support::ulittle32_t) +
+ successful_modules_count * minidump_module_size;
+
+ error = AddDirectory(StreamType::ModuleList, module_stream_size);
+ if (error.Fail())
+ return error;
+
+ m_data.AppendData(&successful_modules_count,
+ sizeof(llvm::support::ulittle32_t));
+
+ for (size_t i = 0; i < modules_count; ++i) {
+ ModuleSP mod = modules.GetModuleAtIndex(i);
+ std::string module_name = mod->GetSpecificationDescription();
+ auto maybe_mod_size = getModuleFileSize(target, mod);
+ if (!maybe_mod_size)
+ continue;
uint64_t mod_size = std::move(*maybe_mod_size);
@@ -367,8 +378,6 @@ Status MinidumpFileBuilder::AddModuleList() {
ld.DataSize = static_cast<llvm::support::ulittle32_t>(0u);
ld.RVA = static_cast<llvm::support::ulittle32_t>(0u);
- // Setting up LocationDescriptor for uuid string. The global offset into
- // minidump file is calculated.
LocationDescriptor ld_cv;
ld_cv.DataSize = static_cast<llvm::support::ulittle32_t>(
sizeof(llvm::support::ulittle32_t) + uuid.size());
@@ -1055,7 +1064,7 @@ MinidumpFileBuilder::AddMemoryList_32(std::vector<CoreFileMemoryRange> &ranges,
const offset_t offset_for_data = GetCurrentDataEndOffset();
const addr_t addr = core_range.range.start();
const addr_t size = core_range.range.size();
- const addr_t end = core_range.range.end();
+ const addr_t end = core_range.range.end();
LLDB_LOGF(log,
"AddMemoryList %zu/%zu reading memory for region "
>From fe6e54cbd4f678bb7701b3461bb4fe98174784aa Mon Sep 17 00:00:00 2001
From: Bar Soloveychik <barsolo at fb.com>
Date: Mon, 4 Aug 2025 10:20:38 -0700
Subject: [PATCH 2/3] format fixes
---
.../Plugins/ObjectFile/Minidump/MinidumpFileBuilder.cpp | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/lldb/source/Plugins/ObjectFile/Minidump/MinidumpFileBuilder.cpp b/lldb/source/Plugins/ObjectFile/Minidump/MinidumpFileBuilder.cpp
index aa42ed30a8e09..db23278722d4f 100644
--- a/lldb/source/Plugins/ObjectFile/Minidump/MinidumpFileBuilder.cpp
+++ b/lldb/source/Plugins/ObjectFile/Minidump/MinidumpFileBuilder.cpp
@@ -378,6 +378,8 @@ Status MinidumpFileBuilder::AddModuleList() {
ld.DataSize = static_cast<llvm::support::ulittle32_t>(0u);
ld.RVA = static_cast<llvm::support::ulittle32_t>(0u);
+ // Setting up LocationDescriptor for uuid string. The global offset into
+ // minidump file is calculated.
LocationDescriptor ld_cv;
ld_cv.DataSize = static_cast<llvm::support::ulittle32_t>(
sizeof(llvm::support::ulittle32_t) + uuid.size());
@@ -1064,7 +1066,7 @@ MinidumpFileBuilder::AddMemoryList_32(std::vector<CoreFileMemoryRange> &ranges,
const offset_t offset_for_data = GetCurrentDataEndOffset();
const addr_t addr = core_range.range.start();
const addr_t size = core_range.range.size();
- const addr_t end = core_range.range.end();
+ const addr_t end = core_range.range.end();
LLDB_LOGF(log,
"AddMemoryList %zu/%zu reading memory for region "
>From b619ba953ce10d5bf3dbda8bdce64dda6755ef32 Mon Sep 17 00:00:00 2001
From: Bar Soloveychik <barsolo at fb.com>
Date: Mon, 4 Aug 2025 10:39:51 -0700
Subject: [PATCH 3/3] fixed logging format
---
.../Plugins/ObjectFile/Minidump/MinidumpFileBuilder.cpp | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/lldb/source/Plugins/ObjectFile/Minidump/MinidumpFileBuilder.cpp b/lldb/source/Plugins/ObjectFile/Minidump/MinidumpFileBuilder.cpp
index db23278722d4f..07548d349f8f0 100644
--- a/lldb/source/Plugins/ObjectFile/Minidump/MinidumpFileBuilder.cpp
+++ b/lldb/source/Plugins/ObjectFile/Minidump/MinidumpFileBuilder.cpp
@@ -325,9 +325,8 @@ Status MinidumpFileBuilder::AddModuleList() {
llvm::handleAllErrors(
std::move(mod_size_err), [&](const llvm::ErrorInfoBase &E) {
if (log) {
- LLDB_LOG_ERROR(log, llvm::ErrorSuccess(),
- "Unable to get the size of module {}: {}",
- module_name, E.message());
+ LLDB_LOGF(log, "Unable to get the size of module %s: %s",
+ module_name.c_str(), E.message().c_str());
}
});
} else {
More information about the lldb-commits
mailing list