6
6
UNALIGNED_INSTANCE_PATTERN_HEAP = ALIGNED_INSTANCE_PATTERN_HEAP [1 :]
7
7
8
8
9
- def GetAlignedRange (test_base ):
9
+ def GetAlignedRange (test_base , shrink = False ):
10
10
frame = test_base .thread .GetSelectedFrame ()
11
11
ex = frame .EvaluateExpression ("aligned_string_ptr" )
12
12
test_base .assertTrue (ex .IsValid ())
13
- return GetRangeFromAddrValue (test_base , ex )
13
+ return GetRangeFromAddrValue (test_base , ex , shrink )
14
14
15
15
16
- def GetStackRange (test_base ):
16
+ def GetStackRange (test_base , shrink = False ):
17
17
frame = test_base .thread .GetSelectedFrame ()
18
18
ex = frame .EvaluateExpression ("&stack_pointer" )
19
19
test_base .assertTrue (ex .IsValid ())
20
- return GetRangeFromAddrValue (test_base , ex )
20
+ return GetRangeFromAddrValue (test_base , ex , shrink )
21
21
22
22
23
- def GetStackRanges (test_base ):
23
+ def GetStackRanges (test_base , shrink = False ):
24
24
addr_ranges = lldb .SBAddressRangeList ()
25
25
addr_ranges .Append (GetStackRange (test_base ))
26
26
return addr_ranges
27
27
28
28
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
+ """
30
33
region = lldb .SBMemoryRegionInfo ()
31
34
test_base .assertTrue (
32
35
test_base .process .GetMemoryRegionInfo (
@@ -37,37 +40,48 @@ def GetRangeFromAddrValue(test_base, addr):
37
40
test_base .assertTrue (region .IsReadable ())
38
41
test_base .assertFalse (region .IsExecutable ())
39
42
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 ()
43
45
46
+ if shrink :
47
+ addr2 = addr .GetValueAsUnsigned ()
48
+ addr2 -= addr2 % 512
49
+ base = max (base , addr2 - 1024 )
50
+ end = min (end , addr2 + 1024 )
44
51
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 ):
46
59
start_addr = range .GetBaseAddress ().GetLoadAddress (target )
47
60
end_addr = start_addr + range .GetByteSize ()
48
61
addr = addr .GetValueAsUnsigned ()
49
- return addr >= start_addr and addr < end_addr
62
+ return addr >= start_addr and addr + size <= end_addr
50
63
51
64
52
- def GetHeapRanges (test_base ):
65
+ def GetHeapRanges (test_base , shrink = False ):
53
66
frame = test_base .thread .GetSelectedFrame ()
54
67
55
68
ex = frame .EvaluateExpression ("heap_pointer1" )
56
69
test_base .assertTrue (ex .IsValid ())
57
- range = GetRangeFromAddrValue (test_base , ex )
70
+ range = GetRangeFromAddrValue (test_base , ex , shrink )
58
71
addr_ranges = lldb .SBAddressRangeList ()
59
72
addr_ranges .Append (range )
60
73
61
74
ex = frame .EvaluateExpression ("heap_pointer2" )
62
75
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 ))
65
79
66
80
return addr_ranges
67
81
68
82
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 ))
72
86
73
87
return ranges
0 commit comments