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