99from lldbsuite .test import lldbutil
1010from dataclass import dataclass
1111
12+
1213class AddressRange :
1314 begin : int
1415 end : int
@@ -26,27 +27,35 @@ def process_from_yaml(self, yaml_file):
2627 self .process = self .target .LoadCore (minidump_path )
2728 return self .process
2829
29- def validate_regions_saved_correctly (self , core_process , expected_region , expected_invalid_region = None ):
30- """ Validate that the expected_region is saved in the core_proc, and that the expected invalid region is not saved, if not not none. """
30+ def validate_regions_saved_correctly (
31+ self , core_process , expected_region , expected_invalid_region = None
32+ ):
33+ """Validate that the expected_region is saved in the core_proc, and that the expected invalid region is not saved, if not not none."""
3134
32- # Validate we can read the entire expected_region
33- error = lldb .SBError ()
34- core_process .ReadMemory (expected_region .begin , expected_region .end - expected_region .begin , error )
35- self .assertTrue (error .Success (), error .GetCString ())
35+ # Validate we can read the entire expected_region
36+ error = lldb .SBError ()
37+ core_process .ReadMemory (
38+ expected_region .begin , expected_region .end - expected_region .begin , error
39+ )
40+ self .assertTrue (error .Success (), error .GetCString ())
3641
37- # Validate we can't read before and after the expected_region
38- core_process .ReadMemory (expected_region .begin - 1 , 1 , error )
39- self .assertTrue (error .Fail (), error .GetCString ())
42+ # Validate we can't read before and after the expected_region
43+ core_process .ReadMemory (expected_region .begin - 1 , 1 , error )
44+ self .assertTrue (error .Fail (), error .GetCString ())
4045
41- core_process .ReadMemory (expected_region .end + 1 , 1 , error )
42- self .assertTrue (error .Fail (), error .GetCString ())
46+ core_process .ReadMemory (expected_region .end + 1 , 1 , error )
47+ self .assertTrue (error .Fail (), error .GetCString ())
4348
44- if expected_invalid_region is None :
45- return
49+ if expected_invalid_region is None :
50+ return
4651
47- # Validate we can't read the original_region
48- core_process .ReadMemory (expected_invalid_region .begin , expected_invalid_region .end - expected_invalid_region .end , error )
49- self .assertTrue (error .Success (), error .GetCString ())
52+ # Validate we can't read the original_region
53+ core_process .ReadMemory (
54+ expected_invalid_region .begin ,
55+ expected_invalid_region .end - expected_invalid_region .end ,
56+ error ,
57+ )
58+ self .assertTrue (error .Success (), error .GetCString ())
5059
5160 def test_saving_sub_memory_range (self ):
5261 """
@@ -76,7 +85,9 @@ def test_saving_sub_memory_range(self):
7685
7786 expected_address_range = AddressRange (begin , end )
7887 expected_invalid_range = AddressRange (begin , 0x2020 )
79- self .validate_regions_saved_correctly (core_process , expected_address_range , expected_invalid_range )
88+ self .validate_regions_saved_correctly (
89+ core_process , expected_address_range , expected_invalid_range
90+ )
8091
8192 def test_saving_super_memory_range (self ):
8293 """
@@ -106,7 +117,9 @@ def test_saving_super_memory_range(self):
106117
107118 expected_address_range = AddressRange (begin , end )
108119 expected_invalid_range = AddressRange (begin - 16 , end + 16 )
109- self .validate_regions_saved_correctly (core_process , expected_address_range , expected_invalid_range )
120+ self .validate_regions_saved_correctly (
121+ core_process , expected_address_range , expected_invalid_range
122+ )
110123
111124 def test_region_that_goes_out_of_bounds (self ):
112125 """
@@ -134,7 +147,9 @@ def test_region_that_goes_out_of_bounds(self):
134147
135148 expected_address_range = AddressRange (begin , end )
136149 expected_invalid_range = AddressRange (begin - 16 , end + 16 )
137- self .validate_regions_saved_correctly (core_process , expected_address_range , expected_invalid_range )
150+ self .validate_regions_saved_correctly (
151+ core_process , expected_address_range , expected_invalid_range
152+ )
138153
139154 def test_region_that_starts_out_of_bounds (self ):
140155 """
@@ -162,4 +177,63 @@ def test_region_that_starts_out_of_bounds(self):
162177
163178 expected_address_range = AddressRange (begin , end )
164179 expected_invalid_range = AddressRange (begin - 16 , end )
165- self .validate_regions_saved_correctly (core_process , expected_address_range , expected_invalid_range )
180+ self .validate_regions_saved_correctly (
181+ core_process , expected_address_range , expected_invalid_range
182+ )
183+
184+ def test_region_spans_multiple_regions (self ):
185+ """
186+ Validate we can save a Minidump for a custom region
187+ that includes a start in a (---) page but ends in a valid page.
188+ """
189+ yaml = "minidump_mem64.yaml"
190+ proc = self .process_from_yaml (yaml )
191+ new_minidump_path = self .getBuildArtifact (__name__ + ".dmp" )
192+ options = lldb .SBSaveCoreOptions ()
193+ options .SetOutputFile (lldb .SBFileSpec (new_minidump_path ))
194+ options .SetPluginName ("minidump" )
195+ options .SetStyle (lldb .eSaveCoreCustomOnly )
196+
197+ size = 0x1000
198+ begin = 0x5000
199+ end = begin + size
200+ custom_range = lldb .SBMemoryRegionInfo ("" , begin , end , 3 , True , False )
201+ options .AddMemoryRegionToSave (custom_range )
202+
203+ error = proc .SaveCore (options )
204+ self .assertTrue (error .Success (), error .GetCString ())
205+ core_target = self .dbg .CreateTarget (None )
206+ core_process = core_target .LoadCore (new_minidump_path )
207+
208+ expected_address_range = AddressRange (begin , end )
209+ self .validate_regions_saved_correctly (core_process , expected_address_range )
210+
211+ def test_region_spans_multiple_regions_with_one_subrange (self ):
212+ """
213+ Validate we can save a Minidump for a custom region
214+ that includes a start in a (---) page but ends in a valid page.
215+ """
216+ yaml = "minidump_mem64.yaml"
217+ proc = self .process_from_yaml (yaml )
218+ new_minidump_path = self .getBuildArtifact (__name__ + ".dmp" )
219+ options = lldb .SBSaveCoreOptions ()
220+ options .SetOutputFile (lldb .SBFileSpec (new_minidump_path ))
221+ options .SetPluginName ("minidump" )
222+ options .SetStyle (lldb .eSaveCoreCustomOnly )
223+
224+ size = 0x800
225+ begin = 0x5000
226+ end = begin + size
227+ custom_range = lldb .SBMemoryRegionInfo ("" , begin , end , 3 , True , False )
228+ options .AddMemoryRegionToSave (custom_range )
229+
230+ error = proc .SaveCore (options )
231+ self .assertTrue (error .Success (), error .GetCString ())
232+ core_target = self .dbg .CreateTarget (None )
233+ core_process = core_target .LoadCore (new_minidump_path )
234+
235+ expected_address_range = AddressRange (begin , end )
236+ expected_invalid_range = AddressRange (begin , begin + 0x1000 )
237+ self .validate_regions_saved_correctly (
238+ core_process , expected_address_range , expected_invalid_range
239+ )
0 commit comments