Skip to content

Commit 0975e2a

Browse files
authored
[LLDB][Minidump] Add a progress bar to minidump (#108309)
Added a progress tracker to Minidump file builders memory saving
1 parent 6ca5c39 commit 0975e2a

File tree

3 files changed

+32
-12
lines changed

3 files changed

+32
-12
lines changed

lldb/include/lldb/Target/CoreFileMemoryRanges.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
#include "lldb/Utility/RangeMap.h"
1010
#include "lldb/Utility/Status.h"
11+
#include "lldb/Utility/StreamString.h"
1112

1213
#include "llvm/ADT/AddressRanges.h"
1314

@@ -35,6 +36,16 @@ struct CoreFileMemoryRange {
3536
return lldb_permissions < rhs.lldb_permissions;
3637
return false;
3738
}
39+
40+
std::string Dump() const {
41+
lldb_private::StreamString stream;
42+
stream << "[";
43+
stream.PutHex64(range.start());
44+
stream << '-';
45+
stream.PutHex64(range.end());
46+
stream << ")";
47+
return stream.GetString().str();
48+
}
3849
};
3950

4051
class CoreFileMemoryRanges

lldb/source/Plugins/ObjectFile/Minidump/MinidumpFileBuilder.cpp

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -837,15 +837,17 @@ Status MinidumpFileBuilder::AddMemoryList() {
837837
error = m_process_sp->CalculateCoreFileSaveRanges(m_save_core_options,
838838
all_core_memory_ranges);
839839

840+
if (error.Fail())
841+
return error;
842+
843+
lldb_private::Progress progress("Saving Minidump File", "",
844+
all_core_memory_ranges.GetSize());
840845
std::vector<CoreFileMemoryRange> all_core_memory_vec;
841846
// Extract all the data into just a vector of data. So we can mutate this in
842847
// place.
843848
for (const auto &core_range : all_core_memory_ranges)
844849
all_core_memory_vec.push_back(core_range.data);
845850

846-
if (error.Fail())
847-
return error;
848-
849851
// Start by saving all of the stacks and ensuring they fit under the 32b
850852
// limit.
851853
uint64_t total_size = GetCurrentDataEndOffset();
@@ -892,13 +894,13 @@ Status MinidumpFileBuilder::AddMemoryList() {
892894
}
893895
}
894896

895-
error = AddMemoryList_32(ranges_32);
897+
error = AddMemoryList_32(ranges_32, progress);
896898
if (error.Fail())
897899
return error;
898900

899901
// Add the remaining memory as a 64b range.
900902
if (!ranges_64.empty()) {
901-
error = AddMemoryList_64(ranges_64);
903+
error = AddMemoryList_64(ranges_64, progress);
902904
if (error.Fail())
903905
return error;
904906
}
@@ -972,8 +974,9 @@ GetLargestRangeSize(const std::vector<CoreFileMemoryRange> &ranges) {
972974
return max_size;
973975
}
974976

975-
Status MinidumpFileBuilder::AddMemoryList_32(
976-
std::vector<CoreFileMemoryRange> &ranges) {
977+
Status
978+
MinidumpFileBuilder::AddMemoryList_32(std::vector<CoreFileMemoryRange> &ranges,
979+
Progress &progress) {
977980
std::vector<MemoryDescriptor> descriptors;
978981
Status error;
979982
if (ranges.size() == 0)
@@ -996,6 +999,7 @@ Status MinidumpFileBuilder::AddMemoryList_32(
996999
region_index, ranges.size(), size, addr, addr + size);
9971000
++region_index;
9981001

1002+
progress.Increment(1, "Adding Memory Range " + core_range.Dump());
9991003
const size_t bytes_read =
10001004
m_process_sp->ReadMemory(addr, data_up->GetBytes(), size, error);
10011005
if (error.Fail() || bytes_read == 0) {
@@ -1049,8 +1053,9 @@ Status MinidumpFileBuilder::AddMemoryList_32(
10491053
return error;
10501054
}
10511055

1052-
Status MinidumpFileBuilder::AddMemoryList_64(
1053-
std::vector<CoreFileMemoryRange> &ranges) {
1056+
Status
1057+
MinidumpFileBuilder::AddMemoryList_64(std::vector<CoreFileMemoryRange> &ranges,
1058+
Progress &progress) {
10541059
Status error;
10551060
if (ranges.empty())
10561061
return error;
@@ -1111,6 +1116,7 @@ Status MinidumpFileBuilder::AddMemoryList_64(
11111116
region_index, ranges.size(), size, addr, addr + size);
11121117
++region_index;
11131118

1119+
progress.Increment(1, "Adding Memory Range " + core_range.Dump());
11141120
const size_t bytes_read =
11151121
m_process_sp->ReadMemory(addr, data_up->GetBytes(), size, error);
11161122
if (error.Fail()) {

lldb/source/Plugins/ObjectFile/Minidump/MinidumpFileBuilder.h

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#include <utility>
2424
#include <variant>
2525

26+
#include "lldb/Core/Progress.h"
2627
#include "lldb/Symbol/SaveCoreOptions.h"
2728
#include "lldb/Target/Process.h"
2829
#include "lldb/Target/Target.h"
@@ -79,7 +80,7 @@ class MinidumpFileBuilder {
7980
const lldb::ProcessSP &process_sp,
8081
lldb_private::SaveCoreOptions &save_core_options)
8182
: m_process_sp(process_sp), m_core_file(std::move(core_file)),
82-
m_save_core_options(save_core_options){}
83+
m_save_core_options(save_core_options) {}
8384

8485
MinidumpFileBuilder(const MinidumpFileBuilder &) = delete;
8586
MinidumpFileBuilder &operator=(const MinidumpFileBuilder &) = delete;
@@ -124,9 +125,11 @@ class MinidumpFileBuilder {
124125
lldb_private::Status AddData(const void *data, uint64_t size);
125126
// Add MemoryList stream, containing dumps of important memory segments
126127
lldb_private::Status
127-
AddMemoryList_64(std::vector<lldb_private::CoreFileMemoryRange> &ranges);
128+
AddMemoryList_64(std::vector<lldb_private::CoreFileMemoryRange> &ranges,
129+
lldb_private::Progress &progress);
128130
lldb_private::Status
129-
AddMemoryList_32(std::vector<lldb_private::CoreFileMemoryRange> &ranges);
131+
AddMemoryList_32(std::vector<lldb_private::CoreFileMemoryRange> &ranges,
132+
lldb_private::Progress &progress);
130133
// Update the thread list on disk with the newly emitted stack RVAs.
131134
lldb_private::Status FixThreadStacks();
132135
lldb_private::Status FlushBufferToDisk();

0 commit comments

Comments
 (0)