[Lldb-commits] [lldb] [LLDB][SBSaveCoreOptions] Add new API to expose the expected core size in bytes (PR #138169)
Jacob Lalonde via lldb-commits
lldb-commits at lists.llvm.org
Thu May 1 10:17:11 PDT 2025
https://github.com/Jlalond updated https://github.com/llvm/llvm-project/pull/138169
>From ef04502d17c36044cd5fb96f333c328c8215f354 Mon Sep 17 00:00:00 2001
From: Jacob Lalonde <jalalonde at fb.com>
Date: Thu, 1 May 2025 10:11:10 -0700
Subject: [PATCH 1/2] Add new API to expose the expected size in bytes of a
core before generation
---
lldb/include/lldb/API/SBSaveCoreOptions.h | 13 ++++++++++++
lldb/include/lldb/Symbol/SaveCoreOptions.h | 2 ++
lldb/source/API/SBSaveCoreOptions.cpp | 5 +++++
lldb/source/Symbol/SaveCoreOptions.cpp | 18 ++++++++++++++++
.../TestSBSaveCoreOptions.py | 21 +++++++++++++++++++
.../sbsavecoreoptions/basic_minidump.yaml | 5 +++++
6 files changed, 64 insertions(+)
diff --git a/lldb/include/lldb/API/SBSaveCoreOptions.h b/lldb/include/lldb/API/SBSaveCoreOptions.h
index c6d2ab6099b3c..4c051353a714e 100644
--- a/lldb/include/lldb/API/SBSaveCoreOptions.h
+++ b/lldb/include/lldb/API/SBSaveCoreOptions.h
@@ -119,6 +119,19 @@ class LLDB_API SBSaveCoreOptions {
/// an empty collection will be returned.
SBThreadCollection GetThreadsToSave() const;
+ /// Get the current total number of bytes the core is expected to be but not
+ /// including the overhead of the core file format. Requires a Process and
+ /// Style to be specified.
+ ///
+ /// \note
+ /// This can cause some modification of the underlying data store
+ /// as regions with no permissions, or invalid permissions will be removed
+ /// and stacks will be minified up to their stack pointer + the redzone.
+ ///
+ /// \returns
+ /// The expected size of the data contained in the core in bytes.
+ uint64_t GetCurrentSizeInBytes(SBError &error);
+
/// Reset all options.
void Clear();
diff --git a/lldb/include/lldb/Symbol/SaveCoreOptions.h b/lldb/include/lldb/Symbol/SaveCoreOptions.h
index bcf0087fbea5c..319d44a6b0c87 100644
--- a/lldb/include/lldb/Symbol/SaveCoreOptions.h
+++ b/lldb/include/lldb/Symbol/SaveCoreOptions.h
@@ -49,6 +49,8 @@ class SaveCoreOptions {
lldb_private::ThreadCollection::collection GetThreadsToSave() const;
+ uint64_t GetCurrentSizeInBytes(Status &error);
+
void Clear();
private:
diff --git a/lldb/source/API/SBSaveCoreOptions.cpp b/lldb/source/API/SBSaveCoreOptions.cpp
index 35b9da569dfa1..b67df513fe91b 100644
--- a/lldb/source/API/SBSaveCoreOptions.cpp
+++ b/lldb/source/API/SBSaveCoreOptions.cpp
@@ -114,6 +114,11 @@ void SBSaveCoreOptions::Clear() {
m_opaque_up->Clear();
}
+uint64_t SBSaveCoreOptions::GetCurrentSizeInBytes(SBError &error) {
+ LLDB_INSTRUMENT_VA(this, error);
+ return m_opaque_up->GetCurrentSizeInBytes(error.ref());
+}
+
lldb_private::SaveCoreOptions &SBSaveCoreOptions::ref() const {
return *m_opaque_up.get();
}
diff --git a/lldb/source/Symbol/SaveCoreOptions.cpp b/lldb/source/Symbol/SaveCoreOptions.cpp
index c9f6efeb25d22..1da3e1cc9f834 100644
--- a/lldb/source/Symbol/SaveCoreOptions.cpp
+++ b/lldb/source/Symbol/SaveCoreOptions.cpp
@@ -145,6 +145,24 @@ SaveCoreOptions::GetThreadsToSave() const {
return thread_collection;
}
+uint64_t SaveCoreOptions::GetCurrentSizeInBytes(Status &error) {
+ if (!m_process_sp) {
+ error = Status::FromErrorString("Requires a process to be set.");
+ return 0;
+ }
+
+ CoreFileMemoryRanges ranges;
+ error = m_process_sp->CalculateCoreFileSaveRanges(*this, ranges);
+ if (error.Fail())
+ return 0;
+
+ uint64_t total_in_bytes = 0;
+ for (auto& core_range : ranges)
+ total_in_bytes += core_range.data.range.size();
+
+ return total_in_bytes;
+}
+
void SaveCoreOptions::ClearProcessSpecificData() {
// Deliberately not following the formatter style here to indicate that
// this method will be expanded in the future.
diff --git a/lldb/test/API/python_api/sbsavecoreoptions/TestSBSaveCoreOptions.py b/lldb/test/API/python_api/sbsavecoreoptions/TestSBSaveCoreOptions.py
index ace84e8497a59..215f8440cc68a 100644
--- a/lldb/test/API/python_api/sbsavecoreoptions/TestSBSaveCoreOptions.py
+++ b/lldb/test/API/python_api/sbsavecoreoptions/TestSBSaveCoreOptions.py
@@ -104,3 +104,24 @@ def test_removing_and_adding_insertion_order(self):
thread_collection = options.GetThreadsToSave()
self.assertEqual(thread_collection.GetSize(), 3)
self.assertIn(middle_thread, thread_collection)
+
+ def test_get_total_in_bytes(self):
+ """
+ Tests that get total in bytes properly returns an error without a process,
+ and the readable regions with a process.
+ """
+
+ options = lldb.SBSaveCoreOptions()
+ options.SetStyle(lldb.eSaveCoreCustomOnly)
+ process = self.get_basic_process()
+ memory_range = lldb.SBMemoryRegionInfo()
+ process.GetMemoryRegionInfo(0x7FFF12A84030, memory_range)
+ options.AddMemoryRegionToSave(memory_range)
+ error = lldb.SBError()
+ total = options.GetCurrentSizeInBytes(error)
+ self.assertTrue(error.Fail(), error.GetCString())
+ options.SetProcess(process)
+ total = options.GetCurrentSizeInBytes(error)
+ self.assertTrue(error.Success(), error.GetCString())
+ expected_size = memory_range.GetRegionEnd() - memory_range.GetRegionBase()
+ self.assertEqual(total, expected_size)
diff --git a/lldb/test/API/python_api/sbsavecoreoptions/basic_minidump.yaml b/lldb/test/API/python_api/sbsavecoreoptions/basic_minidump.yaml
index 96302fbfb6b5c..5033787019d7b 100644
--- a/lldb/test/API/python_api/sbsavecoreoptions/basic_minidump.yaml
+++ b/lldb/test/API/python_api/sbsavecoreoptions/basic_minidump.yaml
@@ -34,3 +34,8 @@ Streams:
Stack:
Start of Memory Range: 0x00007FFFC8DFF000
Content: 'BAADBEEF'
+ - Type: Memory64List
+ Memory Ranges:
+ - Start of Memory Range: 0x7FFF12A84030
+ Data Size: 0x2FD0
+ Content : ''
>From 6f41d701d87dbcd1a09debc490ee954bfc4049c2 Mon Sep 17 00:00:00 2001
From: Jacob Lalonde <jalalonde at fb.com>
Date: Thu, 1 May 2025 10:17:00 -0700
Subject: [PATCH 2/2] Add check to EnsureValidConfiguration to filter out some
corner cases
---
lldb/include/lldb/API/SBSaveCoreOptions.h | 6 +++---
lldb/source/Symbol/SaveCoreOptions.cpp | 6 +++++-
2 files changed, 8 insertions(+), 4 deletions(-)
diff --git a/lldb/include/lldb/API/SBSaveCoreOptions.h b/lldb/include/lldb/API/SBSaveCoreOptions.h
index 4c051353a714e..2066ab3e8246c 100644
--- a/lldb/include/lldb/API/SBSaveCoreOptions.h
+++ b/lldb/include/lldb/API/SBSaveCoreOptions.h
@@ -120,11 +120,11 @@ class LLDB_API SBSaveCoreOptions {
SBThreadCollection GetThreadsToSave() const;
/// Get the current total number of bytes the core is expected to be but not
- /// including the overhead of the core file format. Requires a Process and
+ /// including the overhead of the core file format. Requires a Process and
/// Style to be specified.
- ///
+ ///
/// \note
- /// This can cause some modification of the underlying data store
+ /// This can cause some modification of the underlying data store
/// as regions with no permissions, or invalid permissions will be removed
/// and stacks will be minified up to their stack pointer + the redzone.
///
diff --git a/lldb/source/Symbol/SaveCoreOptions.cpp b/lldb/source/Symbol/SaveCoreOptions.cpp
index 1da3e1cc9f834..cf6fc99f7236e 100644
--- a/lldb/source/Symbol/SaveCoreOptions.cpp
+++ b/lldb/source/Symbol/SaveCoreOptions.cpp
@@ -151,13 +151,17 @@ uint64_t SaveCoreOptions::GetCurrentSizeInBytes(Status &error) {
return 0;
}
+ error = EnsureValidConfiguration(m_process_sp);
+ if (error.Fail())
+ return 0;
+
CoreFileMemoryRanges ranges;
error = m_process_sp->CalculateCoreFileSaveRanges(*this, ranges);
if (error.Fail())
return 0;
uint64_t total_in_bytes = 0;
- for (auto& core_range : ranges)
+ for (auto &core_range : ranges)
total_in_bytes += core_range.data.range.size();
return total_in_bytes;
More information about the lldb-commits
mailing list