66UNALIGNED_INSTANCE_PATTERN_HEAP = ALIGNED_INSTANCE_PATTERN_HEAP [1 :]
77
88
9- def GetAlignedRange (test_base ):
9+ def GetAlignedRange (test_base , shrink = False ):
1010 frame = test_base .thread .GetSelectedFrame ()
1111 ex = frame .EvaluateExpression ("aligned_string_ptr" )
1212 test_base .assertTrue (ex .IsValid ())
13- return GetRangeFromAddrValue (test_base , ex )
13+ return GetRangeFromAddrValue (test_base , ex , shrink )
1414
1515
16- def GetStackRange (test_base ):
16+ def GetStackRange (test_base , shrink = False ):
1717 frame = test_base .thread .GetSelectedFrame ()
1818 ex = frame .EvaluateExpression ("&stack_pointer" )
1919 test_base .assertTrue (ex .IsValid ())
20- return GetRangeFromAddrValue (test_base , ex )
20+ return GetRangeFromAddrValue (test_base , ex , shrink )
2121
2222
23- def GetStackRanges (test_base ):
23+ def GetStackRanges (test_base , shrink = False ):
2424 addr_ranges = lldb .SBAddressRangeList ()
2525 addr_ranges .Append (GetStackRange (test_base ))
2626 return addr_ranges
2727
2828
29- def GetRangeFromAddrValue (test_base , addr ):
29+ def GetRangeFromAddrValue (test_base , addr , shrink = False ):
30+ """Returns a memory region containing 'addr'.
31+ If 'shrink' is True, the address range will be reduced to not exceed 2K.
32+ """
3033 region = lldb .SBMemoryRegionInfo ()
3134 test_base .assertTrue (
3235 test_base .process .GetMemoryRegionInfo (
@@ -37,37 +40,48 @@ def GetRangeFromAddrValue(test_base, addr):
3740 test_base .assertTrue (region .IsReadable ())
3841 test_base .assertFalse (region .IsExecutable ())
3942
40- address_start = lldb .SBAddress (region .GetRegionBase (), test_base .target )
41- stack_size = region .GetRegionEnd () - region .GetRegionBase ()
42- return lldb .SBAddressRange (address_start , stack_size )
43+ base = region .GetRegionBase ()
44+ end = region .GetRegionEnd ()
4345
46+ if shrink :
47+ addr2 = addr .GetValueAsUnsigned ()
48+ addr2 -= addr2 % 512
49+ base = max (base , addr2 - 1024 )
50+ end = min (end , addr2 + 1024 )
4451
45- def IsWithinRange (addr , range , target ):
52+ start = lldb .SBAddress (base , test_base .target )
53+ size = end - base
54+
55+ return lldb .SBAddressRange (start , size )
56+
57+
58+ def IsWithinRange (addr , size , range , target ):
4659 start_addr = range .GetBaseAddress ().GetLoadAddress (target )
4760 end_addr = start_addr + range .GetByteSize ()
4861 addr = addr .GetValueAsUnsigned ()
49- return addr >= start_addr and addr < end_addr
62+ return addr >= start_addr and addr + size <= end_addr
5063
5164
52- def GetHeapRanges (test_base ):
65+ def GetHeapRanges (test_base , shrink = False ):
5366 frame = test_base .thread .GetSelectedFrame ()
5467
5568 ex = frame .EvaluateExpression ("heap_pointer1" )
5669 test_base .assertTrue (ex .IsValid ())
57- range = GetRangeFromAddrValue (test_base , ex )
70+ range = GetRangeFromAddrValue (test_base , ex , shrink )
5871 addr_ranges = lldb .SBAddressRangeList ()
5972 addr_ranges .Append (range )
6073
6174 ex = frame .EvaluateExpression ("heap_pointer2" )
6275 test_base .assertTrue (ex .IsValid ())
63- if not IsWithinRange (ex , addr_ranges [0 ], test_base .target ):
64- addr_ranges .Append (GetRangeFromAddrValue (test_base , ex ))
76+ size = len (DOUBLE_INSTANCE_PATTERN_HEAP )
77+ if not IsWithinRange (ex , size , addr_ranges [0 ], test_base .target ):
78+ addr_ranges .Append (GetRangeFromAddrValue (test_base , ex , shrink ))
6579
6680 return addr_ranges
6781
6882
69- def GetRanges (test_base ):
70- ranges = GetHeapRanges (test_base )
71- ranges .Append (GetStackRanges (test_base ))
83+ def GetRanges (test_base , shrink = False ):
84+ ranges = GetHeapRanges (test_base , shrink )
85+ ranges .Append (GetStackRanges (test_base , shrink ))
7286
7387 return ranges
0 commit comments