Skip to content

Commit b88d94c

Browse files
authored
[lldb] Speed up FindInMemory tests (llvm#111951)
A memory region can be relatively large. Searching for a value in the entire region is time-consuming, especially when running tests against a remote target, because the memory data is transferred in small chunks over a relatively slow GDB Remote Protocol. The patch limits the address range to be searched to 2K, which seems sufficient for these tests. In my setup, for local runs, these tests now take half the time they did before the patch. For a remote target, the improvement is even more significant.
1 parent 47d9ca8 commit b88d94c

File tree

3 files changed

+45
-31
lines changed

3 files changed

+45
-31
lines changed

lldb/test/API/python_api/find_in_memory/TestFindInMemory.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ def test_find_in_memory_ok(self):
5555
error = lldb.SBError()
5656
addr = self.process.FindInMemory(
5757
SINGLE_INSTANCE_PATTERN_STACK,
58-
GetStackRange(self),
58+
GetStackRange(self, True),
5959
1,
6060
error,
6161
)
@@ -70,7 +70,7 @@ def test_find_in_memory_double_instance_ok(self):
7070
error = lldb.SBError()
7171
addr = self.process.FindInMemory(
7272
DOUBLE_INSTANCE_PATTERN_HEAP,
73-
GetHeapRanges(self)[0],
73+
GetHeapRanges(self, True)[0],
7474
1,
7575
error,
7676
)
@@ -86,7 +86,7 @@ def test_find_in_memory_invalid_alignment(self):
8686
error = lldb.SBError()
8787
addr = self.process.FindInMemory(
8888
SINGLE_INSTANCE_PATTERN_STACK,
89-
GetStackRange(self),
89+
GetStackRange(self, True),
9090
0,
9191
error,
9292
)
@@ -118,7 +118,7 @@ def test_find_in_memory_invalid_buffer(self):
118118
error = lldb.SBError()
119119
addr = self.process.FindInMemory(
120120
"",
121-
GetStackRange(self),
121+
GetStackRange(self, True),
122122
1,
123123
error,
124124
)
@@ -131,7 +131,7 @@ def test_find_in_memory_unaligned(self):
131131
self.assertTrue(self.process, PROCESS_IS_VALID)
132132
self.assertState(self.process.GetState(), lldb.eStateStopped, PROCESS_STOPPED)
133133
error = lldb.SBError()
134-
range = GetAlignedRange(self)
134+
range = GetAlignedRange(self, True)
135135

136136
# First we make sure the pattern is found with alignment 1
137137
addr = self.process.FindInMemory(

lldb/test/API/python_api/find_in_memory/TestFindRangesInMemory.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ def test_find_ranges_in_memory_two_matches(self):
3030
self.assertTrue(self.process, PROCESS_IS_VALID)
3131
self.assertState(self.process.GetState(), lldb.eStateStopped, PROCESS_STOPPED)
3232

33-
addr_ranges = GetHeapRanges(self)
33+
addr_ranges = GetHeapRanges(self, True)
3434
error = lldb.SBError()
3535
matches = self.process.FindRangesInMemory(
3636
DOUBLE_INSTANCE_PATTERN_HEAP,
@@ -48,7 +48,7 @@ def test_find_ranges_in_memory_one_match(self):
4848
self.assertTrue(self.process, PROCESS_IS_VALID)
4949
self.assertState(self.process.GetState(), lldb.eStateStopped, PROCESS_STOPPED)
5050

51-
addr_ranges = GetStackRanges(self)
51+
addr_ranges = GetStackRanges(self, True)
5252
error = lldb.SBError()
5353
matches = self.process.FindRangesInMemory(
5454
SINGLE_INSTANCE_PATTERN_STACK,
@@ -66,7 +66,7 @@ def test_find_ranges_in_memory_one_match_multiple_ranges(self):
6666
self.assertTrue(self.process, PROCESS_IS_VALID)
6767
self.assertState(self.process.GetState(), lldb.eStateStopped, PROCESS_STOPPED)
6868

69-
addr_ranges = GetRanges(self)
69+
addr_ranges = GetRanges(self, True)
7070
addr_ranges.Append(lldb.SBAddressRange())
7171
self.assertGreater(addr_ranges.GetSize(), 2)
7272
error = lldb.SBError()
@@ -86,7 +86,7 @@ def test_find_ranges_in_memory_one_match_max(self):
8686
self.assertTrue(self.process, PROCESS_IS_VALID)
8787
self.assertState(self.process.GetState(), lldb.eStateStopped, PROCESS_STOPPED)
8888

89-
addr_ranges = GetHeapRanges(self)
89+
addr_ranges = GetHeapRanges(self, True)
9090
error = lldb.SBError()
9191
matches = self.process.FindRangesInMemory(
9292
DOUBLE_INSTANCE_PATTERN_HEAP,
@@ -104,7 +104,7 @@ def test_find_ranges_in_memory_invalid_alignment(self):
104104
self.assertTrue(self.process, PROCESS_IS_VALID)
105105
self.assertState(self.process.GetState(), lldb.eStateStopped, PROCESS_STOPPED)
106106

107-
addr_ranges = GetHeapRanges(self)
107+
addr_ranges = GetHeapRanges(self, True)
108108
error = lldb.SBError()
109109
matches = self.process.FindRangesInMemory(
110110
DOUBLE_INSTANCE_PATTERN_HEAP,
@@ -160,7 +160,7 @@ def test_find_ranges_in_memory_invalid_buffer(self):
160160
self.assertTrue(self.process, PROCESS_IS_VALID)
161161
self.assertState(self.process.GetState(), lldb.eStateStopped, PROCESS_STOPPED)
162162

163-
addr_ranges = GetHeapRanges(self)
163+
addr_ranges = GetHeapRanges(self, True)
164164
error = lldb.SBError()
165165
matches = self.process.FindRangesInMemory(
166166
"",
@@ -178,7 +178,7 @@ def test_find_ranges_in_memory_invalid_max_matches(self):
178178
self.assertTrue(self.process, PROCESS_IS_VALID)
179179
self.assertState(self.process.GetState(), lldb.eStateStopped, PROCESS_STOPPED)
180180

181-
addr_ranges = GetHeapRanges(self)
181+
addr_ranges = GetHeapRanges(self, True)
182182
error = lldb.SBError()
183183
matches = self.process.FindRangesInMemory(
184184
DOUBLE_INSTANCE_PATTERN_HEAP,
@@ -197,7 +197,7 @@ def test_find_in_memory_unaligned(self):
197197
self.assertState(self.process.GetState(), lldb.eStateStopped, PROCESS_STOPPED)
198198

199199
addr_ranges = lldb.SBAddressRangeList()
200-
addr_ranges.Append(GetAlignedRange(self))
200+
addr_ranges.Append(GetAlignedRange(self, True))
201201
error = lldb.SBError()
202202

203203
matches = self.process.FindRangesInMemory(

lldb/test/API/python_api/find_in_memory/address_ranges_helper.py

Lines changed: 32 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -6,27 +6,30 @@
66
UNALIGNED_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

Comments
 (0)