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 <jalalo...@fb.com> Date: Thu, 1 May 2025 10:11:10 -0700 Subject: [PATCH 1/3] 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 <jalalo...@fb.com> Date: Thu, 1 May 2025 10:17:00 -0700 Subject: [PATCH 2/3] 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; >From 53d8c0b4ec3f55db71f5d1aa3c56ebbaa860f807 Mon Sep 17 00:00:00 2001 From: Jacob Lalonde <jalalo...@fb.com> Date: Thu, 1 May 2025 10:20:51 -0700 Subject: [PATCH 3/3] Py formatting --- .../API/python_api/sbsavecoreoptions/TestSBSaveCoreOptions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lldb/test/API/python_api/sbsavecoreoptions/TestSBSaveCoreOptions.py b/lldb/test/API/python_api/sbsavecoreoptions/TestSBSaveCoreOptions.py index 215f8440cc68a..a8a6302d7cf13 100644 --- a/lldb/test/API/python_api/sbsavecoreoptions/TestSBSaveCoreOptions.py +++ b/lldb/test/API/python_api/sbsavecoreoptions/TestSBSaveCoreOptions.py @@ -107,7 +107,7 @@ def test_removing_and_adding_insertion_order(self): def test_get_total_in_bytes(self): """ - Tests that get total in bytes properly returns an error without a process, + Tests that get total in bytes properly returns an error without a process, and the readable regions with a process. """ _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits