199451b44SJordan Rupprecht""" 299451b44SJordan RupprechtTest SBProcess APIs, including ReadMemory(), WriteMemory(), and others. 399451b44SJordan Rupprecht""" 499451b44SJordan Rupprecht 599451b44SJordan Rupprechtfrom __future__ import print_function 699451b44SJordan Rupprecht 799451b44SJordan Rupprecht 899451b44SJordan Rupprechtimport lldb 999451b44SJordan Rupprechtfrom lldbsuite.test.decorators import * 1099451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import * 1199451b44SJordan Rupprechtfrom lldbsuite.test.lldbutil import get_stopped_thread, state_type_to_str 1299451b44SJordan Rupprecht 1399451b44SJordan Rupprecht 1499451b44SJordan Rupprechtclass ProcessAPITestCase(TestBase): 1599451b44SJordan Rupprecht 1699451b44SJordan Rupprecht mydir = TestBase.compute_mydir(__file__) 1799451b44SJordan Rupprecht 1899451b44SJordan Rupprecht def setUp(self): 1999451b44SJordan Rupprecht # Call super's setUp(). 2099451b44SJordan Rupprecht TestBase.setUp(self) 2199451b44SJordan Rupprecht # Find the line number to break inside main(). 2299451b44SJordan Rupprecht self.line = line_number( 2399451b44SJordan Rupprecht "main.cpp", 2499451b44SJordan Rupprecht "// Set break point at this line and check variable 'my_char'.") 2599451b44SJordan Rupprecht 2699451b44SJordan Rupprecht def test_read_memory(self): 2799451b44SJordan Rupprecht """Test Python SBProcess.ReadMemory() API.""" 2899451b44SJordan Rupprecht self.build() 2999451b44SJordan Rupprecht exe = self.getBuildArtifact("a.out") 3099451b44SJordan Rupprecht 3199451b44SJordan Rupprecht target = self.dbg.CreateTarget(exe) 3299451b44SJordan Rupprecht self.assertTrue(target, VALID_TARGET) 3399451b44SJordan Rupprecht 3499451b44SJordan Rupprecht breakpoint = target.BreakpointCreateByLocation("main.cpp", self.line) 3599451b44SJordan Rupprecht self.assertTrue(breakpoint, VALID_BREAKPOINT) 3699451b44SJordan Rupprecht 3799451b44SJordan Rupprecht # Launch the process, and do not stop at the entry point. 3899451b44SJordan Rupprecht process = target.LaunchSimple( 3999451b44SJordan Rupprecht None, None, self.get_process_working_directory()) 4099451b44SJordan Rupprecht 4199451b44SJordan Rupprecht thread = get_stopped_thread(process, lldb.eStopReasonBreakpoint) 4299451b44SJordan Rupprecht self.assertTrue( 4399451b44SJordan Rupprecht thread.IsValid(), 4499451b44SJordan Rupprecht "There should be a thread stopped due to breakpoint") 4599451b44SJordan Rupprecht frame = thread.GetFrameAtIndex(0) 4699451b44SJordan Rupprecht 4799451b44SJordan Rupprecht # Get the SBValue for the global variable 'my_char'. 4899451b44SJordan Rupprecht val = frame.FindValue("my_char", lldb.eValueTypeVariableGlobal) 4999451b44SJordan Rupprecht self.DebugSBValue(val) 5099451b44SJordan Rupprecht 5199451b44SJordan Rupprecht # Due to the typemap magic (see lldb.swig), we pass in 1 to ReadMemory and 5299451b44SJordan Rupprecht # expect to get a Python string as the result object! 5399451b44SJordan Rupprecht error = lldb.SBError() 5499451b44SJordan Rupprecht self.assertFalse(val.TypeIsPointerType()) 5599451b44SJordan Rupprecht content = process.ReadMemory( 5699451b44SJordan Rupprecht val.AddressOf().GetValueAsUnsigned(), 1, error) 5799451b44SJordan Rupprecht if not error.Success(): 5899451b44SJordan Rupprecht self.fail("SBProcess.ReadMemory() failed") 5999451b44SJordan Rupprecht if self.TraceOn(): 6099451b44SJordan Rupprecht print("memory content:", content) 6199451b44SJordan Rupprecht 6299451b44SJordan Rupprecht self.expect( 6399451b44SJordan Rupprecht content, 6499451b44SJordan Rupprecht "Result from SBProcess.ReadMemory() matches our expected output: 'x'", 6599451b44SJordan Rupprecht exe=False, 6699451b44SJordan Rupprecht startstr=b'x') 6799451b44SJordan Rupprecht 6899451b44SJordan Rupprecht # Read (char *)my_char_ptr. 6999451b44SJordan Rupprecht val = frame.FindValue("my_char_ptr", lldb.eValueTypeVariableGlobal) 7099451b44SJordan Rupprecht self.DebugSBValue(val) 7199451b44SJordan Rupprecht cstring = process.ReadCStringFromMemory( 7299451b44SJordan Rupprecht val.GetValueAsUnsigned(), 256, error) 7399451b44SJordan Rupprecht if not error.Success(): 7499451b44SJordan Rupprecht self.fail("SBProcess.ReadCStringFromMemory() failed") 7599451b44SJordan Rupprecht if self.TraceOn(): 7699451b44SJordan Rupprecht print("cstring read is:", cstring) 7799451b44SJordan Rupprecht 7899451b44SJordan Rupprecht self.expect( 7999451b44SJordan Rupprecht cstring, 8099451b44SJordan Rupprecht "Result from SBProcess.ReadCStringFromMemory() matches our expected output", 8199451b44SJordan Rupprecht exe=False, 8299451b44SJordan Rupprecht startstr='Does it work?') 8399451b44SJordan Rupprecht 8499451b44SJordan Rupprecht # Get the SBValue for the global variable 'my_cstring'. 8599451b44SJordan Rupprecht val = frame.FindValue("my_cstring", lldb.eValueTypeVariableGlobal) 8699451b44SJordan Rupprecht self.DebugSBValue(val) 8799451b44SJordan Rupprecht 8899451b44SJordan Rupprecht # Due to the typemap magic (see lldb.swig), we pass in 256 to read at most 256 bytes 8999451b44SJordan Rupprecht # from the address, and expect to get a Python string as the result 9099451b44SJordan Rupprecht # object! 9199451b44SJordan Rupprecht self.assertFalse(val.TypeIsPointerType()) 9299451b44SJordan Rupprecht cstring = process.ReadCStringFromMemory( 9399451b44SJordan Rupprecht val.AddressOf().GetValueAsUnsigned(), 256, error) 9499451b44SJordan Rupprecht if not error.Success(): 9599451b44SJordan Rupprecht self.fail("SBProcess.ReadCStringFromMemory() failed") 9699451b44SJordan Rupprecht if self.TraceOn(): 9799451b44SJordan Rupprecht print("cstring read is:", cstring) 9899451b44SJordan Rupprecht 9999451b44SJordan Rupprecht self.expect( 10099451b44SJordan Rupprecht cstring, 10199451b44SJordan Rupprecht "Result from SBProcess.ReadCStringFromMemory() matches our expected output", 10299451b44SJordan Rupprecht exe=False, 10399451b44SJordan Rupprecht startstr='lldb.SBProcess.ReadCStringFromMemory() works!') 10499451b44SJordan Rupprecht 10599451b44SJordan Rupprecht # Get the SBValue for the global variable 'my_uint32'. 10699451b44SJordan Rupprecht val = frame.FindValue("my_uint32", lldb.eValueTypeVariableGlobal) 10799451b44SJordan Rupprecht self.DebugSBValue(val) 10899451b44SJordan Rupprecht 10999451b44SJordan Rupprecht # Due to the typemap magic (see lldb.swig), we pass in 4 to read 4 bytes 11099451b44SJordan Rupprecht # from the address, and expect to get an int as the result! 11199451b44SJordan Rupprecht self.assertFalse(val.TypeIsPointerType()) 11299451b44SJordan Rupprecht my_uint32 = process.ReadUnsignedFromMemory( 11399451b44SJordan Rupprecht val.AddressOf().GetValueAsUnsigned(), 4, error) 11499451b44SJordan Rupprecht if not error.Success(): 11599451b44SJordan Rupprecht self.fail("SBProcess.ReadCStringFromMemory() failed") 11699451b44SJordan Rupprecht if self.TraceOn(): 11799451b44SJordan Rupprecht print("uint32 read is:", my_uint32) 11899451b44SJordan Rupprecht 11999451b44SJordan Rupprecht if my_uint32 != 12345: 12099451b44SJordan Rupprecht self.fail( 12199451b44SJordan Rupprecht "Result from SBProcess.ReadUnsignedFromMemory() does not match our expected output") 12299451b44SJordan Rupprecht 12399451b44SJordan Rupprecht def test_write_memory(self): 12499451b44SJordan Rupprecht """Test Python SBProcess.WriteMemory() API.""" 12599451b44SJordan Rupprecht self.build() 12699451b44SJordan Rupprecht exe = self.getBuildArtifact("a.out") 12799451b44SJordan Rupprecht 12899451b44SJordan Rupprecht target = self.dbg.CreateTarget(exe) 12999451b44SJordan Rupprecht self.assertTrue(target, VALID_TARGET) 13099451b44SJordan Rupprecht 13199451b44SJordan Rupprecht breakpoint = target.BreakpointCreateByLocation("main.cpp", self.line) 13299451b44SJordan Rupprecht self.assertTrue(breakpoint, VALID_BREAKPOINT) 13399451b44SJordan Rupprecht 13499451b44SJordan Rupprecht # Launch the process, and do not stop at the entry point. 13599451b44SJordan Rupprecht process = target.LaunchSimple( 13699451b44SJordan Rupprecht None, None, self.get_process_working_directory()) 13799451b44SJordan Rupprecht 13899451b44SJordan Rupprecht thread = get_stopped_thread(process, lldb.eStopReasonBreakpoint) 13999451b44SJordan Rupprecht self.assertTrue( 14099451b44SJordan Rupprecht thread.IsValid(), 14199451b44SJordan Rupprecht "There should be a thread stopped due to breakpoint") 14299451b44SJordan Rupprecht frame = thread.GetFrameAtIndex(0) 14399451b44SJordan Rupprecht 14499451b44SJordan Rupprecht # Get the SBValue for the global variable 'my_char'. 14599451b44SJordan Rupprecht val = frame.FindValue("my_char", lldb.eValueTypeVariableGlobal) 14699451b44SJordan Rupprecht self.DebugSBValue(val) 14799451b44SJordan Rupprecht 14899451b44SJordan Rupprecht # If the variable does not have a load address, there's no sense 14999451b44SJordan Rupprecht # continuing. 15099451b44SJordan Rupprecht if not val.GetLocation().startswith("0x"): 15199451b44SJordan Rupprecht return 15299451b44SJordan Rupprecht 15399451b44SJordan Rupprecht # OK, let's get the hex location of the variable. 15499451b44SJordan Rupprecht location = int(val.GetLocation(), 16) 15599451b44SJordan Rupprecht 15699451b44SJordan Rupprecht # The program logic makes the 'my_char' variable to have memory content as 'x'. 15799451b44SJordan Rupprecht # But we want to use the WriteMemory() API to assign 'a' to the 15899451b44SJordan Rupprecht # variable. 15999451b44SJordan Rupprecht 16099451b44SJordan Rupprecht # Now use WriteMemory() API to write 'a' into the global variable. 16199451b44SJordan Rupprecht error = lldb.SBError() 16299451b44SJordan Rupprecht result = process.WriteMemory(location, 'a', error) 16399451b44SJordan Rupprecht if not error.Success() or result != 1: 16499451b44SJordan Rupprecht self.fail("SBProcess.WriteMemory() failed") 16599451b44SJordan Rupprecht 16699451b44SJordan Rupprecht # Read from the memory location. This time it should be 'a'. 16799451b44SJordan Rupprecht # Due to the typemap magic (see lldb.swig), we pass in 1 to ReadMemory and 16899451b44SJordan Rupprecht # expect to get a Python string as the result object! 16999451b44SJordan Rupprecht content = process.ReadMemory(location, 1, error) 17099451b44SJordan Rupprecht if not error.Success(): 17199451b44SJordan Rupprecht self.fail("SBProcess.ReadMemory() failed") 17299451b44SJordan Rupprecht if self.TraceOn(): 17399451b44SJordan Rupprecht print("memory content:", content) 17499451b44SJordan Rupprecht 17599451b44SJordan Rupprecht self.expect( 17699451b44SJordan Rupprecht content, 17799451b44SJordan Rupprecht "Result from SBProcess.ReadMemory() matches our expected output: 'a'", 17899451b44SJordan Rupprecht exe=False, 17999451b44SJordan Rupprecht startstr=b'a') 18099451b44SJordan Rupprecht 18199451b44SJordan Rupprecht def test_access_my_int(self): 18299451b44SJordan Rupprecht """Test access 'my_int' using Python SBProcess.GetByteOrder() and other APIs.""" 18399451b44SJordan Rupprecht self.build() 18499451b44SJordan Rupprecht exe = self.getBuildArtifact("a.out") 18599451b44SJordan Rupprecht 18699451b44SJordan Rupprecht target = self.dbg.CreateTarget(exe) 18799451b44SJordan Rupprecht self.assertTrue(target, VALID_TARGET) 18899451b44SJordan Rupprecht 18999451b44SJordan Rupprecht breakpoint = target.BreakpointCreateByLocation("main.cpp", self.line) 19099451b44SJordan Rupprecht self.assertTrue(breakpoint, VALID_BREAKPOINT) 19199451b44SJordan Rupprecht 19299451b44SJordan Rupprecht # Launch the process, and do not stop at the entry point. 19399451b44SJordan Rupprecht process = target.LaunchSimple( 19499451b44SJordan Rupprecht None, None, self.get_process_working_directory()) 19599451b44SJordan Rupprecht 19699451b44SJordan Rupprecht thread = get_stopped_thread(process, lldb.eStopReasonBreakpoint) 19799451b44SJordan Rupprecht self.assertTrue( 19899451b44SJordan Rupprecht thread.IsValid(), 19999451b44SJordan Rupprecht "There should be a thread stopped due to breakpoint") 20099451b44SJordan Rupprecht frame = thread.GetFrameAtIndex(0) 20199451b44SJordan Rupprecht 20299451b44SJordan Rupprecht # Get the SBValue for the global variable 'my_int'. 20399451b44SJordan Rupprecht val = frame.FindValue("my_int", lldb.eValueTypeVariableGlobal) 20499451b44SJordan Rupprecht self.DebugSBValue(val) 20599451b44SJordan Rupprecht 20699451b44SJordan Rupprecht # If the variable does not have a load address, there's no sense 20799451b44SJordan Rupprecht # continuing. 20899451b44SJordan Rupprecht if not val.GetLocation().startswith("0x"): 20999451b44SJordan Rupprecht return 21099451b44SJordan Rupprecht 21199451b44SJordan Rupprecht # OK, let's get the hex location of the variable. 21299451b44SJordan Rupprecht location = int(val.GetLocation(), 16) 21399451b44SJordan Rupprecht 21499451b44SJordan Rupprecht # Note that the canonical from of the bytearray is little endian. 21599451b44SJordan Rupprecht from lldbsuite.test.lldbutil import int_to_bytearray, bytearray_to_int 21699451b44SJordan Rupprecht 21799451b44SJordan Rupprecht byteSize = val.GetByteSize() 21899451b44SJordan Rupprecht bytes = int_to_bytearray(256, byteSize) 21999451b44SJordan Rupprecht 22099451b44SJordan Rupprecht byteOrder = process.GetByteOrder() 22199451b44SJordan Rupprecht if byteOrder == lldb.eByteOrderBig: 22299451b44SJordan Rupprecht bytes.reverse() 22399451b44SJordan Rupprecht elif byteOrder == lldb.eByteOrderLittle: 22499451b44SJordan Rupprecht pass 22599451b44SJordan Rupprecht else: 22699451b44SJordan Rupprecht # Neither big endian nor little endian? Return for now. 22799451b44SJordan Rupprecht # Add more logic here if we want to handle other types. 22899451b44SJordan Rupprecht return 22999451b44SJordan Rupprecht 23099451b44SJordan Rupprecht # The program logic makes the 'my_int' variable to have int type and value of 0. 23199451b44SJordan Rupprecht # But we want to use the WriteMemory() API to assign 256 to the 23299451b44SJordan Rupprecht # variable. 23399451b44SJordan Rupprecht 23499451b44SJordan Rupprecht # Now use WriteMemory() API to write 256 into the global variable. 23599451b44SJordan Rupprecht error = lldb.SBError() 23699451b44SJordan Rupprecht result = process.WriteMemory(location, bytes, error) 23799451b44SJordan Rupprecht if not error.Success() or result != byteSize: 23899451b44SJordan Rupprecht self.fail("SBProcess.WriteMemory() failed") 23999451b44SJordan Rupprecht 24099451b44SJordan Rupprecht # Make sure that the val we got originally updates itself to notice the 24199451b44SJordan Rupprecht # change: 24299451b44SJordan Rupprecht self.expect( 24399451b44SJordan Rupprecht val.GetValue(), 24499451b44SJordan Rupprecht "SBProcess.ReadMemory() successfully writes (int)256 to the memory location for 'my_int'", 24599451b44SJordan Rupprecht exe=False, 24699451b44SJordan Rupprecht startstr='256') 24799451b44SJordan Rupprecht 24899451b44SJordan Rupprecht # And for grins, get the SBValue for the global variable 'my_int' 24999451b44SJordan Rupprecht # again, to make sure that also tracks the new value: 25099451b44SJordan Rupprecht val = frame.FindValue("my_int", lldb.eValueTypeVariableGlobal) 25199451b44SJordan Rupprecht self.expect( 25299451b44SJordan Rupprecht val.GetValue(), 25399451b44SJordan Rupprecht "SBProcess.ReadMemory() successfully writes (int)256 to the memory location for 'my_int'", 25499451b44SJordan Rupprecht exe=False, 25599451b44SJordan Rupprecht startstr='256') 25699451b44SJordan Rupprecht 25799451b44SJordan Rupprecht # Now read the memory content. The bytearray should have (byte)1 as 25899451b44SJordan Rupprecht # the second element. 25999451b44SJordan Rupprecht content = process.ReadMemory(location, byteSize, error) 26099451b44SJordan Rupprecht if not error.Success(): 26199451b44SJordan Rupprecht self.fail("SBProcess.ReadMemory() failed") 26299451b44SJordan Rupprecht 26399451b44SJordan Rupprecht # The bytearray_to_int utility function expects a little endian 26499451b44SJordan Rupprecht # bytearray. 26599451b44SJordan Rupprecht if byteOrder == lldb.eByteOrderBig: 26699451b44SJordan Rupprecht content = bytearray(content, 'ascii') 26799451b44SJordan Rupprecht content.reverse() 26899451b44SJordan Rupprecht 26999451b44SJordan Rupprecht new_value = bytearray_to_int(content, byteSize) 27099451b44SJordan Rupprecht if new_value != 256: 27199451b44SJordan Rupprecht self.fail("Memory content read from 'my_int' does not match (int)256") 27299451b44SJordan Rupprecht 27399451b44SJordan Rupprecht # Dump the memory content.... 27499451b44SJordan Rupprecht if self.TraceOn(): 27599451b44SJordan Rupprecht for i in content: 27699451b44SJordan Rupprecht print("byte:", i) 27799451b44SJordan Rupprecht 27899451b44SJordan Rupprecht def test_remote_launch(self): 27999451b44SJordan Rupprecht """Test SBProcess.RemoteLaunch() API with a process not in eStateConnected, and it should fail.""" 28099451b44SJordan Rupprecht self.build() 28199451b44SJordan Rupprecht exe = self.getBuildArtifact("a.out") 28299451b44SJordan Rupprecht 28399451b44SJordan Rupprecht target = self.dbg.CreateTarget(exe) 28499451b44SJordan Rupprecht self.assertTrue(target, VALID_TARGET) 28599451b44SJordan Rupprecht 28699451b44SJordan Rupprecht # Launch the process, and do not stop at the entry point. 28799451b44SJordan Rupprecht process = target.LaunchSimple( 28899451b44SJordan Rupprecht None, None, self.get_process_working_directory()) 28999451b44SJordan Rupprecht 29099451b44SJordan Rupprecht if self.TraceOn(): 29199451b44SJordan Rupprecht print("process state:", state_type_to_str(process.GetState())) 29299451b44SJordan Rupprecht self.assertTrue(process.GetState() != lldb.eStateConnected) 29399451b44SJordan Rupprecht 29499451b44SJordan Rupprecht error = lldb.SBError() 29599451b44SJordan Rupprecht success = process.RemoteLaunch( 29699451b44SJordan Rupprecht None, None, None, None, None, None, 0, False, error) 29799451b44SJordan Rupprecht self.assertTrue( 29899451b44SJordan Rupprecht not success, 29999451b44SJordan Rupprecht "RemoteLaunch() should fail for process state != eStateConnected") 30099451b44SJordan Rupprecht 30199451b44SJordan Rupprecht def test_get_num_supported_hardware_watchpoints(self): 30299451b44SJordan Rupprecht """Test SBProcess.GetNumSupportedHardwareWatchpoints() API with a process.""" 30399451b44SJordan Rupprecht self.build() 30499451b44SJordan Rupprecht exe = self.getBuildArtifact("a.out") 30599451b44SJordan Rupprecht self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET) 30699451b44SJordan Rupprecht 30799451b44SJordan Rupprecht target = self.dbg.CreateTarget(exe) 30899451b44SJordan Rupprecht self.assertTrue(target, VALID_TARGET) 30999451b44SJordan Rupprecht 31099451b44SJordan Rupprecht breakpoint = target.BreakpointCreateByLocation("main.cpp", self.line) 31199451b44SJordan Rupprecht self.assertTrue(breakpoint, VALID_BREAKPOINT) 31299451b44SJordan Rupprecht 31399451b44SJordan Rupprecht # Launch the process, and do not stop at the entry point. 31499451b44SJordan Rupprecht process = target.LaunchSimple( 31599451b44SJordan Rupprecht None, None, self.get_process_working_directory()) 31699451b44SJordan Rupprecht 31799451b44SJordan Rupprecht error = lldb.SBError() 31899451b44SJordan Rupprecht num = process.GetNumSupportedHardwareWatchpoints(error) 31999451b44SJordan Rupprecht if self.TraceOn() and error.Success(): 32099451b44SJordan Rupprecht print("Number of supported hardware watchpoints: %d" % num) 32199451b44SJordan Rupprecht 32299451b44SJordan Rupprecht @no_debug_info_test 323*66b829acSJonas Devlieghere @skipIfRemote 32499451b44SJordan Rupprecht def test_get_process_info(self): 32599451b44SJordan Rupprecht """Test SBProcess::GetProcessInfo() API with a locally launched process.""" 32699451b44SJordan Rupprecht self.build() 32799451b44SJordan Rupprecht exe = self.getBuildArtifact("a.out") 32899451b44SJordan Rupprecht self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET) 32999451b44SJordan Rupprecht 33099451b44SJordan Rupprecht target = self.dbg.CreateTarget(exe) 33199451b44SJordan Rupprecht self.assertTrue(target, VALID_TARGET) 33299451b44SJordan Rupprecht 33399451b44SJordan Rupprecht # Launch the process and stop at the entry point. 33486aa8e63SJonas Devlieghere launch_info = target.GetLaunchInfo() 33599451b44SJordan Rupprecht launch_info.SetWorkingDirectory(self.get_process_working_directory()) 33699451b44SJordan Rupprecht launch_flags = launch_info.GetLaunchFlags() 33799451b44SJordan Rupprecht launch_flags |= lldb.eLaunchFlagStopAtEntry 33899451b44SJordan Rupprecht launch_info.SetLaunchFlags(launch_flags) 33999451b44SJordan Rupprecht error = lldb.SBError() 34099451b44SJordan Rupprecht process = target.Launch(launch_info, error) 34199451b44SJordan Rupprecht 34299451b44SJordan Rupprecht if not error.Success(): 34399451b44SJordan Rupprecht self.fail("Failed to launch process") 34499451b44SJordan Rupprecht 34599451b44SJordan Rupprecht # Verify basic process info can be retrieved successfully 34699451b44SJordan Rupprecht process_info = process.GetProcessInfo() 34799451b44SJordan Rupprecht self.assertTrue(process_info.IsValid()) 34899451b44SJordan Rupprecht file_spec = process_info.GetExecutableFile() 34999451b44SJordan Rupprecht self.assertTrue(file_spec.IsValid()) 35099451b44SJordan Rupprecht process_name = process_info.GetName() 35199451b44SJordan Rupprecht self.assertIsNotNone(process_name, "Process has a name") 35299451b44SJordan Rupprecht self.assertGreater(len(process_name), 0, "Process name isn't blank") 35399451b44SJordan Rupprecht self.assertEqual(file_spec.GetFilename(), "a.out") 35499451b44SJordan Rupprecht self.assertNotEqual( 35599451b44SJordan Rupprecht process_info.GetProcessID(), lldb.LLDB_INVALID_PROCESS_ID, 35699451b44SJordan Rupprecht "Process ID is valid") 357251a5d9dSBruce Mitchener triple = process_info.GetTriple() 358251a5d9dSBruce Mitchener self.assertIsNotNone(triple, "Process has a triple") 35999451b44SJordan Rupprecht 36099451b44SJordan Rupprecht # Additional process info varies by platform, so just check that 36199451b44SJordan Rupprecht # whatever info was retrieved is consistent and nothing blows up. 36299451b44SJordan Rupprecht if process_info.UserIDIsValid(): 36399451b44SJordan Rupprecht self.assertNotEqual( 36499451b44SJordan Rupprecht process_info.GetUserID(), lldb.UINT32_MAX, 36599451b44SJordan Rupprecht "Process user ID is valid") 36699451b44SJordan Rupprecht else: 36799451b44SJordan Rupprecht self.assertEqual( 36899451b44SJordan Rupprecht process_info.GetUserID(), lldb.UINT32_MAX, 36999451b44SJordan Rupprecht "Process user ID is invalid") 37099451b44SJordan Rupprecht 37199451b44SJordan Rupprecht if process_info.GroupIDIsValid(): 37299451b44SJordan Rupprecht self.assertNotEqual( 37399451b44SJordan Rupprecht process_info.GetGroupID(), lldb.UINT32_MAX, 37499451b44SJordan Rupprecht "Process group ID is valid") 37599451b44SJordan Rupprecht else: 37699451b44SJordan Rupprecht self.assertEqual( 37799451b44SJordan Rupprecht process_info.GetGroupID(), lldb.UINT32_MAX, 37899451b44SJordan Rupprecht "Process group ID is invalid") 37999451b44SJordan Rupprecht 38099451b44SJordan Rupprecht if process_info.EffectiveUserIDIsValid(): 38199451b44SJordan Rupprecht self.assertNotEqual( 38299451b44SJordan Rupprecht process_info.GetEffectiveUserID(), lldb.UINT32_MAX, 38399451b44SJordan Rupprecht "Process effective user ID is valid") 38499451b44SJordan Rupprecht else: 38599451b44SJordan Rupprecht self.assertEqual( 38699451b44SJordan Rupprecht process_info.GetEffectiveUserID(), lldb.UINT32_MAX, 38799451b44SJordan Rupprecht "Process effective user ID is invalid") 38899451b44SJordan Rupprecht 38999451b44SJordan Rupprecht if process_info.EffectiveGroupIDIsValid(): 39099451b44SJordan Rupprecht self.assertNotEqual( 39199451b44SJordan Rupprecht process_info.GetEffectiveGroupID(), lldb.UINT32_MAX, 39299451b44SJordan Rupprecht "Process effective group ID is valid") 39399451b44SJordan Rupprecht else: 39499451b44SJordan Rupprecht self.assertEqual( 39599451b44SJordan Rupprecht process_info.GetEffectiveGroupID(), lldb.UINT32_MAX, 39699451b44SJordan Rupprecht "Process effective group ID is invalid") 39799451b44SJordan Rupprecht 39899451b44SJordan Rupprecht process_info.GetParentProcessID() 3992e7ec447SPeter S. Housel 4002e7ec447SPeter S. Housel def test_allocate_deallocate_memory(self): 4012e7ec447SPeter S. Housel """Test Python SBProcess.AllocateMemory() and SBProcess.DeallocateMemory() APIs.""" 4022e7ec447SPeter S. Housel self.build() 4032e7ec447SPeter S. Housel (target, process, main_thread, main_breakpoint) = lldbutil.run_to_source_breakpoint( 4042e7ec447SPeter S. Housel self, "// Set break point at this line", lldb.SBFileSpec("main.cpp")) 4052e7ec447SPeter S. Housel 4062e7ec447SPeter S. Housel # Allocate a block of memory in the target process 4072e7ec447SPeter S. Housel error = lldb.SBError() 4082e7ec447SPeter S. Housel addr = process.AllocateMemory(16384, lldb.ePermissionsReadable, error) 4092e7ec447SPeter S. Housel if not error.Success() or addr == lldb.LLDB_INVALID_ADDRESS: 4102e7ec447SPeter S. Housel self.fail("SBProcess.AllocateMemory() failed") 4112e7ec447SPeter S. Housel 4122e7ec447SPeter S. Housel # Now use WriteMemory() API to write 'a' into the allocated 4132e7ec447SPeter S. Housel # memory. Note that the debugger can do this even though the 4142e7ec447SPeter S. Housel # block is not set writable. 4152e7ec447SPeter S. Housel result = process.WriteMemory(addr, 'a', error) 4162e7ec447SPeter S. Housel if not error.Success() or result != 1: 4172e7ec447SPeter S. Housel self.fail("SBProcess.WriteMemory() failed") 4182e7ec447SPeter S. Housel 4192e7ec447SPeter S. Housel # Read from the memory location. This time it should be 'a'. 4202e7ec447SPeter S. Housel # Due to the typemap magic (see lldb.swig), we pass in 1 to ReadMemory and 4212e7ec447SPeter S. Housel # expect to get a Python string as the result object! 4222e7ec447SPeter S. Housel content = process.ReadMemory(addr, 1, error) 4232e7ec447SPeter S. Housel if not error.Success(): 4242e7ec447SPeter S. Housel self.fail("SBProcess.ReadMemory() failed") 4252e7ec447SPeter S. Housel if self.TraceOn(): 4262e7ec447SPeter S. Housel print("memory content:", content) 4272e7ec447SPeter S. Housel 4282e7ec447SPeter S. Housel self.expect( 4292e7ec447SPeter S. Housel content, 4302e7ec447SPeter S. Housel "Result from SBProcess.ReadMemory() matches our expected output: 'a'", 4312e7ec447SPeter S. Housel exe=False, 4322e7ec447SPeter S. Housel startstr=b'a') 4332e7ec447SPeter S. Housel 4342e7ec447SPeter S. Housel # Verify that the process itself can read the allocated memory 4352e7ec447SPeter S. Housel frame = main_thread.GetFrameAtIndex(0) 4362e7ec447SPeter S. Housel val = frame.EvaluateExpression( 4372e7ec447SPeter S. Housel "test_read(reinterpret_cast<char *>({:#x}))".format(addr)) 4382e7ec447SPeter S. Housel self.expect(val.GetValue(), 4392e7ec447SPeter S. Housel "Result of test_read() matches expected output 'a'", 4402e7ec447SPeter S. Housel exe=False, 4412e7ec447SPeter S. Housel startstr="'a'") 4422e7ec447SPeter S. Housel 4432e7ec447SPeter S. Housel # Verify that the process cannot write into the block 4442e7ec447SPeter S. Housel val = frame.EvaluateExpression( 4452e7ec447SPeter S. Housel "test_write(reinterpret_cast<char *>({:#x}), 'b')".format(addr)) 4462e7ec447SPeter S. Housel if val.GetError().Success(): 4472e7ec447SPeter S. Housel self.fail( 4482e7ec447SPeter S. Housel "test_write() to allocated memory without write permission unexpectedly succeeded") 4492e7ec447SPeter S. Housel 4502e7ec447SPeter S. Housel # Deallocate the memory 4512e7ec447SPeter S. Housel error = process.DeallocateMemory(addr) 4522e7ec447SPeter S. Housel if not error.Success(): 4532e7ec447SPeter S. Housel self.fail("SBProcess.DeallocateMemory() failed") 454