[Lldb-commits] [lldb] [LLDB][SBSaveCore] Add Extension to Save a thread and N pointers dead (PR #111601)
Jacob Lalonde via lldb-commits
lldb-commits at lists.llvm.org
Tue Oct 8 15:56:15 PDT 2024
https://github.com/Jlalond created https://github.com/llvm/llvm-project/pull/111601
This adds an extension to allow the saving of a Thread and it's pointers N layers deep via BFS. This lets SBSaveCore 'automagically' figure out everything important for a given thread to save on your behalf.
>From b128131f457a013102b2a0b2fcb968956d980076 Mon Sep 17 00:00:00 2001
From: Jacob Lalonde <jalalonde at 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 fb88cd1ec39daf00f40b45c324bb1b1bbc56c2d6 Mon Sep 17 00:00:00 2001
From: Jacob Lalonde <jalalonde at 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
More information about the lldb-commits
mailing list