Author: Jacob Lalonde Date: 2024-09-16T15:13:35-07:00 New Revision: 0975e2ac58b6d62429d51df54911fb4d03dcda05
URL: https://github.com/llvm/llvm-project/commit/0975e2ac58b6d62429d51df54911fb4d03dcda05 DIFF: https://github.com/llvm/llvm-project/commit/0975e2ac58b6d62429d51df54911fb4d03dcda05.diff LOG: [LLDB][Minidump] Add a progress bar to minidump (#108309) Added a progress tracker to Minidump file builders memory saving Added: Modified: lldb/include/lldb/Target/CoreFileMemoryRanges.h lldb/source/Plugins/ObjectFile/Minidump/MinidumpFileBuilder.cpp lldb/source/Plugins/ObjectFile/Minidump/MinidumpFileBuilder.h Removed: ################################################################################ diff --git a/lldb/include/lldb/Target/CoreFileMemoryRanges.h b/lldb/include/lldb/Target/CoreFileMemoryRanges.h index 503ecd691e5948..0cc5433525ddc4 100644 --- a/lldb/include/lldb/Target/CoreFileMemoryRanges.h +++ b/lldb/include/lldb/Target/CoreFileMemoryRanges.h @@ -8,6 +8,7 @@ #include "lldb/Utility/RangeMap.h" #include "lldb/Utility/Status.h" +#include "lldb/Utility/StreamString.h" #include "llvm/ADT/AddressRanges.h" @@ -35,6 +36,16 @@ struct CoreFileMemoryRange { return lldb_permissions < rhs.lldb_permissions; return false; } + + std::string Dump() const { + lldb_private::StreamString stream; + stream << "["; + stream.PutHex64(range.start()); + stream << '-'; + stream.PutHex64(range.end()); + stream << ")"; + return stream.GetString().str(); + } }; class CoreFileMemoryRanges diff --git a/lldb/source/Plugins/ObjectFile/Minidump/MinidumpFileBuilder.cpp b/lldb/source/Plugins/ObjectFile/Minidump/MinidumpFileBuilder.cpp index ca22dacb2ba6c9..3f1e25f730a184 100644 --- a/lldb/source/Plugins/ObjectFile/Minidump/MinidumpFileBuilder.cpp +++ b/lldb/source/Plugins/ObjectFile/Minidump/MinidumpFileBuilder.cpp @@ -837,15 +837,17 @@ Status MinidumpFileBuilder::AddMemoryList() { error = m_process_sp->CalculateCoreFileSaveRanges(m_save_core_options, all_core_memory_ranges); + if (error.Fail()) + return error; + + lldb_private::Progress progress("Saving Minidump File", "", + all_core_memory_ranges.GetSize()); std::vector<CoreFileMemoryRange> all_core_memory_vec; // Extract all the data into just a vector of data. So we can mutate this in // place. for (const auto &core_range : all_core_memory_ranges) all_core_memory_vec.push_back(core_range.data); - if (error.Fail()) - return error; - // Start by saving all of the stacks and ensuring they fit under the 32b // limit. uint64_t total_size = GetCurrentDataEndOffset(); @@ -892,13 +894,13 @@ Status MinidumpFileBuilder::AddMemoryList() { } } - error = AddMemoryList_32(ranges_32); + error = AddMemoryList_32(ranges_32, progress); if (error.Fail()) return error; // Add the remaining memory as a 64b range. if (!ranges_64.empty()) { - error = AddMemoryList_64(ranges_64); + error = AddMemoryList_64(ranges_64, progress); if (error.Fail()) return error; } @@ -972,8 +974,9 @@ GetLargestRangeSize(const std::vector<CoreFileMemoryRange> &ranges) { return max_size; } -Status MinidumpFileBuilder::AddMemoryList_32( - std::vector<CoreFileMemoryRange> &ranges) { +Status +MinidumpFileBuilder::AddMemoryList_32(std::vector<CoreFileMemoryRange> &ranges, + Progress &progress) { std::vector<MemoryDescriptor> descriptors; Status error; if (ranges.size() == 0) @@ -996,6 +999,7 @@ Status MinidumpFileBuilder::AddMemoryList_32( region_index, ranges.size(), size, addr, addr + size); ++region_index; + progress.Increment(1, "Adding Memory Range " + core_range.Dump()); const size_t bytes_read = m_process_sp->ReadMemory(addr, data_up->GetBytes(), size, error); if (error.Fail() || bytes_read == 0) { @@ -1049,8 +1053,9 @@ Status MinidumpFileBuilder::AddMemoryList_32( return error; } -Status MinidumpFileBuilder::AddMemoryList_64( - std::vector<CoreFileMemoryRange> &ranges) { +Status +MinidumpFileBuilder::AddMemoryList_64(std::vector<CoreFileMemoryRange> &ranges, + Progress &progress) { Status error; if (ranges.empty()) return error; @@ -1111,6 +1116,7 @@ Status MinidumpFileBuilder::AddMemoryList_64( region_index, ranges.size(), size, addr, addr + size); ++region_index; + progress.Increment(1, "Adding Memory Range " + core_range.Dump()); const size_t bytes_read = m_process_sp->ReadMemory(addr, data_up->GetBytes(), size, error); if (error.Fail()) { diff --git a/lldb/source/Plugins/ObjectFile/Minidump/MinidumpFileBuilder.h b/lldb/source/Plugins/ObjectFile/Minidump/MinidumpFileBuilder.h index 72e5658718b3c4..d5eac9015ac422 100644 --- a/lldb/source/Plugins/ObjectFile/Minidump/MinidumpFileBuilder.h +++ b/lldb/source/Plugins/ObjectFile/Minidump/MinidumpFileBuilder.h @@ -23,6 +23,7 @@ #include <utility> #include <variant> +#include "lldb/Core/Progress.h" #include "lldb/Symbol/SaveCoreOptions.h" #include "lldb/Target/Process.h" #include "lldb/Target/Target.h" @@ -79,7 +80,7 @@ class MinidumpFileBuilder { const lldb::ProcessSP &process_sp, lldb_private::SaveCoreOptions &save_core_options) : m_process_sp(process_sp), m_core_file(std::move(core_file)), - m_save_core_options(save_core_options){} + m_save_core_options(save_core_options) {} MinidumpFileBuilder(const MinidumpFileBuilder &) = delete; MinidumpFileBuilder &operator=(const MinidumpFileBuilder &) = delete; @@ -124,9 +125,11 @@ class MinidumpFileBuilder { lldb_private::Status AddData(const void *data, uint64_t size); // Add MemoryList stream, containing dumps of important memory segments lldb_private::Status - AddMemoryList_64(std::vector<lldb_private::CoreFileMemoryRange> &ranges); + AddMemoryList_64(std::vector<lldb_private::CoreFileMemoryRange> &ranges, + lldb_private::Progress &progress); lldb_private::Status - AddMemoryList_32(std::vector<lldb_private::CoreFileMemoryRange> &ranges); + AddMemoryList_32(std::vector<lldb_private::CoreFileMemoryRange> &ranges, + lldb_private::Progress &progress); // Update the thread list on disk with the newly emitted stack RVAs. lldb_private::Status FixThreadStacks(); lldb_private::Status FlushBufferToDisk(); _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits