@@ -199,3 +199,56 @@ def test_save_linux_mini_dump(self):
199
199
os .unlink (core_sb_dirty )
200
200
if os .path .isfile (core_sb_full ):
201
201
os .unlink (core_sb_full )
202
+
203
+
204
+ @skipUnlessArch ("x86_64" )
205
+ @skipUnlessPlatform (["linux" ])
206
+ def test_save_linux_mini_dump_thread_options (self ):
207
+ """Test that we can save a Linux mini dump
208
+ with a subset of threads"""
209
+
210
+ self .build ()
211
+ exe = self .getBuildArtifact ("a.out" )
212
+ thread_subset_dmp = self .getBuildArtifact ("core.thread.subset.dmp" )
213
+ try :
214
+ target = self .dbg .CreateTarget (exe )
215
+ process = target .LaunchSimple (
216
+ None , None , self .get_process_working_directory ()
217
+ )
218
+ self .assertState (process .GetState (), lldb .eStateStopped )
219
+
220
+ thread_to_include = process .GetThreadAtIndex (0 ).GetThreadID ()
221
+ options = lldb .SBSaveCoreOptions ()
222
+ thread_subset_spec = lldb .SBFileSpec (thread_subset_dmp )
223
+ options .AddThread (thread_to_include )
224
+ options .SetOutputFile (thread_subset_spec )
225
+ options .SetPluginName ("minidump" )
226
+ options .SetStyle (lldb .eSaveCoreStackOnly )
227
+ error = process .SaveCore (options )
228
+ self .assertTrue (error .Success ())
229
+
230
+ core_target = self .dbg .CreateTarget (None )
231
+ core_process = core_target .LoadCore (thread_subset_dmp )
232
+
233
+ self .assertTrue (core_process , PROCESS_IS_VALID )
234
+ self .assertEqual (core_process .GetNumThreads (), 1
235
+ )
236
+ saved_thread = core_process .GetThreadAtIndex (0 )
237
+ expected_thread = process .GetThreadAtIndex (0 )
238
+ self .assertEqual (expected_thread .GetThreadID (), saved_thread .GetThreadID ())
239
+ expected_sp = expected_thread .GetFrameAtIndex (0 ).GetSP ()
240
+ saved_sp = saved_thread .GetFrameAtIndex (0 ).GetSP ()
241
+ self .assertEqual (expected_sp , saved_sp )
242
+ expected_region = lldb .SBMemoryRegionInfo ()
243
+ saved_region = lldb .SBMemoryRegionInfo ()
244
+ error = core_process .GetMemoryRegionInfo (saved_sp , saved_region )
245
+ self .assertTrue (error .Success (), error .GetCString ())
246
+ error = process .GetMemoryRegionInfo (expected_sp , expected_region )
247
+ self .assertTrue (error .Success (), error .GetCString ())
248
+ self .assertEqual (expected_region .GetRegionBase (), saved_region .GetRegionBase ())
249
+ self .assertEqual (expected_region .GetRegionEnd (), saved_region .GetRegionEnd ())
250
+
251
+ finally :
252
+ self .assertTrue (self .dbg .DeleteTarget (target ))
253
+ if os .path .isfile (thread_subset_dmp ):
254
+ os .unlink (thread_subset_dmp )
0 commit comments