https://github.com/Jlalond updated https://github.com/llvm/llvm-project/pull/111601
>From b128131f457a013102b2a0b2fcb968956d980076 Mon Sep 17 00:00:00 2001 From: Jacob Lalonde <jalalo...@fb.com> Date: Tue, 8 Oct 2024 15:52:45 -0700 Subject: [PATCH 1/2] Create new extension for save core to save a thread and N pointers deep --- .../interface/SBSaveCoreOptionsExtensions.i | 31 +++++++++++++++++++ lldb/bindings/interfaces.swig | 1 + .../TestProcessSaveCoreMinidump.py | 22 +++++++++++++ 3 files changed, 54 insertions(+) create mode 100644 lldb/bindings/interface/SBSaveCoreOptionsExtensions.i diff --git a/lldb/bindings/interface/SBSaveCoreOptionsExtensions.i b/lldb/bindings/interface/SBSaveCoreOptionsExtensions.i new file mode 100644 index 00000000000000..668efbf0f932f1 --- /dev/null +++ b/lldb/bindings/interface/SBSaveCoreOptionsExtensions.i @@ -0,0 +1,31 @@ +#extend lldb::SBSaveCoreOptions { +#ifdef SWIGPYTHON + %pythoncode% { + '''Add a thread to the SaveCoreOptions thread list, and follow it's children N pointers deep, adding each memory region to the SaveCoreOptions Memory region list.''' + def save_thread_with_heaps(self, thread, num_heaps_deep = 3): + self.AddThread(thread) + frame = thread.GetFrameAtIndex(0) + process = thread.GetProcess() + queue = [] + for var in frame.locals: + if var.TypeIsPointerType(): + queue.append(var.Dereference()) + + while (num_heaps_deep > 0 and len(queue) > 0): + queue_size = len(queue) + for i in range(0, queue_size): + var = queue.pop(0) + memory_region = lldb.SBMemoryRegionInfo() + process.GetMemoryRegionInfo(var.GetAddress().GetOffset(), memory_region) + self.AddMemoryRegionToSave(memory_region) + /* + We only check for direct pointer children T*, should probably scan + internal to the children themselves. + */ + for x in var.children: + if x.TypeIsPointerType(): + queue.append(x.Dereference()) + + num_heaps_deep -= 1 +} +#endif SWIGPYTHON diff --git a/lldb/bindings/interfaces.swig b/lldb/bindings/interfaces.swig index 8a6fed95f0b729..8a82ba28d3f2ae 100644 --- a/lldb/bindings/interfaces.swig +++ b/lldb/bindings/interfaces.swig @@ -26,6 +26,7 @@ %include "./interface/SBCommunicationDocstrings.i" %include "./interface/SBCompileUnitDocstrings.i" %include "./interface/SBSaveCoreOptionsDocstrings.i" +#include "./interface/SBSaveCoreOptionsExtensions.i" %include "./interface/SBDataDocstrings.i" %include "./interface/SBDebuggerDocstrings.i" %include "./interface/SBDeclarationDocstrings.i" diff --git a/lldb/test/API/functionalities/process_save_core_minidump/TestProcessSaveCoreMinidump.py b/lldb/test/API/functionalities/process_save_core_minidump/TestProcessSaveCoreMinidump.py index 03cc415924e0bb..cb5d625f4bffa4 100644 --- a/lldb/test/API/functionalities/process_save_core_minidump/TestProcessSaveCoreMinidump.py +++ b/lldb/test/API/functionalities/process_save_core_minidump/TestProcessSaveCoreMinidump.py @@ -3,6 +3,7 @@ """ import os + import lldb from lldbsuite.test.decorators import * from lldbsuite.test.lldbtest import * @@ -470,6 +471,27 @@ def save_core_with_region(self, process, region_index): if os.path.isfile(custom_file): os.unlink(custom_file) + def save_core_one_thread_one_heap(self, process, region_index): + try: + custom_file = self.getBuildArtifact("core.one_thread_one_heap.dmp") + options = lldb.SBSaveCoreOptions() + options.SetOutputFile(lldb.SBFileSpec(custom_file)) + options.SetPluginName("minidump") + options.SetStyle(lldb.eSaveCoreCustomOnly) + thread = process.GetThreadAtIndex(0) + options.save_thread_with_heaps(thread) + + error = process.SaveCore(options) + self.assertTrue(error.Success()) + core_target = self.dbg.CreateTarget(None) + core_proc = core_target.LoadCore(custom_file) + # proc/pid maps prevent us from checking the number of regions, but + # this is mostly a smoke test for the extension. + self.assertEqual(core_proc.GetNumThreads(), 1) + finally: + if os.path.isfile(custom_file): + os.unlink(custom_file) + @skipUnlessArch("x86_64") @skipUnlessPlatform(["linux"]) def test_save_minidump_custom_save_style_duplicated_regions(self): >From e4c9404eaec18f69e7f3490712c98c626e5bd984 Mon Sep 17 00:00:00 2001 From: Jacob Lalonde <jalalo...@fb.com> Date: Tue, 8 Oct 2024 15:53:19 -0700 Subject: [PATCH 2/2] Reword the variable --- lldb/bindings/interface/SBSaveCoreOptionsExtensions.i | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lldb/bindings/interface/SBSaveCoreOptionsExtensions.i b/lldb/bindings/interface/SBSaveCoreOptionsExtensions.i index 668efbf0f932f1..5d20aacacadad4 100644 --- a/lldb/bindings/interface/SBSaveCoreOptionsExtensions.i +++ b/lldb/bindings/interface/SBSaveCoreOptionsExtensions.i @@ -2,7 +2,7 @@ #ifdef SWIGPYTHON %pythoncode% { '''Add a thread to the SaveCoreOptions thread list, and follow it's children N pointers deep, adding each memory region to the SaveCoreOptions Memory region list.''' - def save_thread_with_heaps(self, thread, num_heaps_deep = 3): + def save_thread_with_heaps(self, thread, num_pointers_deep = 3): self.AddThread(thread) frame = thread.GetFrameAtIndex(0) process = thread.GetProcess() @@ -11,7 +11,7 @@ if var.TypeIsPointerType(): queue.append(var.Dereference()) - while (num_heaps_deep > 0 and len(queue) > 0): + while (num_pointers_deep > 0 and len(queue) > 0): queue_size = len(queue) for i in range(0, queue_size): var = queue.pop(0) @@ -26,6 +26,6 @@ if x.TypeIsPointerType(): queue.append(x.Dereference()) - num_heaps_deep -= 1 + num_pointers_deep -= 1 } #endif SWIGPYTHON _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits