xref: /llvm-project/lldb/test/API/python_api/find_in_memory/TestFindInMemory.py (revision 2a1a02461a8d4ae9f560a4215fe85a1f085b4d82)
1"""
2Test Process::FindInMemory.
3"""
4
5import lldb
6from lldbsuite.test.lldbtest import *
7from lldbsuite.test import lldbutil
8from address_ranges_helper import *
9
10
11class FindInMemoryTestCase(TestBase):
12    NO_DEBUG_INFO_TESTCASE = True
13
14    def setUp(self):
15        TestBase.setUp(self)
16
17        self.build()
18        (
19            self.target,
20            self.process,
21            self.thread,
22            self.bp,
23        ) = lldbutil.run_to_source_breakpoint(
24            self,
25            "break here",
26            lldb.SBFileSpec("main.cpp"),
27        )
28        self.assertTrue(self.bp.IsValid())
29
30    def test_check_stack_pointer(self):
31        """Make sure the 'stack_pointer' variable lives on the stack"""
32        self.assertTrue(self.process, PROCESS_IS_VALID)
33        self.assertState(self.process.GetState(), lldb.eStateStopped, PROCESS_STOPPED)
34
35        frame = self.thread.GetSelectedFrame()
36        ex = frame.EvaluateExpression("&stack_pointer")
37        variable_region = lldb.SBMemoryRegionInfo()
38        self.assertTrue(
39            self.process.GetMemoryRegionInfo(
40                ex.GetValueAsUnsigned(), variable_region
41            ).Success(),
42        )
43
44        stack_region = lldb.SBMemoryRegionInfo()
45        self.assertTrue(
46            self.process.GetMemoryRegionInfo(frame.GetSP(), stack_region).Success(),
47        )
48
49        self.assertEqual(variable_region, stack_region)
50
51    def test_find_in_memory_ok(self):
52        """Make sure a match exists in the heap memory and the right address ranges are provided"""
53        self.assertTrue(self.process, PROCESS_IS_VALID)
54        self.assertState(self.process.GetState(), lldb.eStateStopped, PROCESS_STOPPED)
55        error = lldb.SBError()
56        addr = self.process.FindInMemory(
57            SINGLE_INSTANCE_PATTERN_STACK,
58            GetStackRange(self, True),
59            1,
60            error,
61        )
62
63        self.assertSuccess(error)
64        self.assertNotEqual(addr, lldb.LLDB_INVALID_ADDRESS)
65
66    def test_find_in_memory_double_instance_ok(self):
67        """Make sure a match exists in the heap memory and the right address ranges are provided"""
68        self.assertTrue(self.process, PROCESS_IS_VALID)
69        self.assertState(self.process.GetState(), lldb.eStateStopped, PROCESS_STOPPED)
70        error = lldb.SBError()
71        addr = self.process.FindInMemory(
72            DOUBLE_INSTANCE_PATTERN_HEAP,
73            GetHeapRanges(self, True)[0],
74            1,
75            error,
76        )
77
78        self.assertSuccess(error)
79        self.assertNotEqual(addr, lldb.LLDB_INVALID_ADDRESS)
80
81    def test_find_in_memory_invalid_alignment(self):
82        """Make sure the alignment 0 is failing"""
83        self.assertTrue(self.process, PROCESS_IS_VALID)
84        self.assertState(self.process.GetState(), lldb.eStateStopped, PROCESS_STOPPED)
85
86        error = lldb.SBError()
87        addr = self.process.FindInMemory(
88            SINGLE_INSTANCE_PATTERN_STACK,
89            GetStackRange(self, True),
90            0,
91            error,
92        )
93
94        self.assertFailure(error)
95        self.assertEqual(addr, lldb.LLDB_INVALID_ADDRESS)
96
97    def test_find_in_memory_invalid_address_range(self):
98        """Make sure invalid address range is failing"""
99        self.assertTrue(self.process, PROCESS_IS_VALID)
100        self.assertState(self.process.GetState(), lldb.eStateStopped, PROCESS_STOPPED)
101
102        error = lldb.SBError()
103        addr = self.process.FindInMemory(
104            SINGLE_INSTANCE_PATTERN_STACK,
105            lldb.SBAddressRange(),
106            1,
107            error,
108        )
109
110        self.assertFailure(error)
111        self.assertEqual(addr, lldb.LLDB_INVALID_ADDRESS)
112
113    def test_find_in_memory_invalid_buffer(self):
114        """Make sure the empty buffer is failing"""
115        self.assertTrue(self.process, PROCESS_IS_VALID)
116        self.assertState(self.process.GetState(), lldb.eStateStopped, PROCESS_STOPPED)
117
118        error = lldb.SBError()
119        addr = self.process.FindInMemory(
120            "",
121            GetStackRange(self, True),
122            1,
123            error,
124        )
125
126        self.assertFailure(error)
127        self.assertEqual(addr, lldb.LLDB_INVALID_ADDRESS)
128
129    def test_find_in_memory_unaligned(self):
130        """Make sure the unaligned match exists in the heap memory and is not found with alignment 8"""
131        self.assertTrue(self.process, PROCESS_IS_VALID)
132        self.assertState(self.process.GetState(), lldb.eStateStopped, PROCESS_STOPPED)
133        error = lldb.SBError()
134        range = GetAlignedRange(self, True)
135
136        # First we make sure the pattern is found with alignment 1
137        addr = self.process.FindInMemory(
138            UNALIGNED_INSTANCE_PATTERN_HEAP,
139            range,
140            1,
141            error,
142        )
143        self.assertSuccess(error)
144        self.assertNotEqual(addr, lldb.LLDB_INVALID_ADDRESS)
145
146        # With alignment 8 the pattern should not be found
147        addr = self.process.FindInMemory(
148            UNALIGNED_INSTANCE_PATTERN_HEAP,
149            range,
150            8,
151            error,
152        )
153        self.assertSuccess(error)
154        self.assertEqual(addr, lldb.LLDB_INVALID_ADDRESS)
155
156    def test_memory_info_list_iterable(self):
157        """Make sure the SBMemoryRegionInfoList is iterable"""
158        self.assertTrue(self.process, PROCESS_IS_VALID)
159        self.assertState(self.process.GetState(), lldb.eStateStopped, PROCESS_STOPPED)
160
161        info_list = self.process.GetMemoryRegions()
162        self.assertTrue(info_list.GetSize() > 0)
163        try:
164            for info in info_list:
165                pass
166        except Exception:
167            self.fail("SBMemoryRegionInfoList is not iterable")
168