1*99451b44SJordan Rupprecht""" 2*99451b44SJordan RupprechtTest SBProcess APIs, including ReadMemory(), WriteMemory(), and others. 3*99451b44SJordan Rupprecht""" 4*99451b44SJordan Rupprecht 5*99451b44SJordan Rupprechtfrom __future__ import print_function 6*99451b44SJordan Rupprecht 7*99451b44SJordan Rupprecht 8*99451b44SJordan Rupprechtimport lldb 9*99451b44SJordan Rupprechtfrom lldbsuite.test.decorators import * 10*99451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import * 11*99451b44SJordan Rupprechtfrom lldbsuite.test.lldbutil import get_stopped_thread, state_type_to_str 12*99451b44SJordan Rupprecht 13*99451b44SJordan Rupprecht 14*99451b44SJordan Rupprechtclass ProcessAPITestCase(TestBase): 15*99451b44SJordan Rupprecht 16*99451b44SJordan Rupprecht mydir = TestBase.compute_mydir(__file__) 17*99451b44SJordan Rupprecht 18*99451b44SJordan Rupprecht def setUp(self): 19*99451b44SJordan Rupprecht # Call super's setUp(). 20*99451b44SJordan Rupprecht TestBase.setUp(self) 21*99451b44SJordan Rupprecht # Find the line number to break inside main(). 22*99451b44SJordan Rupprecht self.line = line_number( 23*99451b44SJordan Rupprecht "main.cpp", 24*99451b44SJordan Rupprecht "// Set break point at this line and check variable 'my_char'.") 25*99451b44SJordan Rupprecht 26*99451b44SJordan Rupprecht @add_test_categories(['pyapi']) 27*99451b44SJordan Rupprecht def test_read_memory(self): 28*99451b44SJordan Rupprecht """Test Python SBProcess.ReadMemory() API.""" 29*99451b44SJordan Rupprecht self.build() 30*99451b44SJordan Rupprecht exe = self.getBuildArtifact("a.out") 31*99451b44SJordan Rupprecht 32*99451b44SJordan Rupprecht target = self.dbg.CreateTarget(exe) 33*99451b44SJordan Rupprecht self.assertTrue(target, VALID_TARGET) 34*99451b44SJordan Rupprecht 35*99451b44SJordan Rupprecht breakpoint = target.BreakpointCreateByLocation("main.cpp", self.line) 36*99451b44SJordan Rupprecht self.assertTrue(breakpoint, VALID_BREAKPOINT) 37*99451b44SJordan Rupprecht 38*99451b44SJordan Rupprecht # Launch the process, and do not stop at the entry point. 39*99451b44SJordan Rupprecht process = target.LaunchSimple( 40*99451b44SJordan Rupprecht None, None, self.get_process_working_directory()) 41*99451b44SJordan Rupprecht 42*99451b44SJordan Rupprecht thread = get_stopped_thread(process, lldb.eStopReasonBreakpoint) 43*99451b44SJordan Rupprecht self.assertTrue( 44*99451b44SJordan Rupprecht thread.IsValid(), 45*99451b44SJordan Rupprecht "There should be a thread stopped due to breakpoint") 46*99451b44SJordan Rupprecht frame = thread.GetFrameAtIndex(0) 47*99451b44SJordan Rupprecht 48*99451b44SJordan Rupprecht # Get the SBValue for the global variable 'my_char'. 49*99451b44SJordan Rupprecht val = frame.FindValue("my_char", lldb.eValueTypeVariableGlobal) 50*99451b44SJordan Rupprecht self.DebugSBValue(val) 51*99451b44SJordan Rupprecht 52*99451b44SJordan Rupprecht # Due to the typemap magic (see lldb.swig), we pass in 1 to ReadMemory and 53*99451b44SJordan Rupprecht # expect to get a Python string as the result object! 54*99451b44SJordan Rupprecht error = lldb.SBError() 55*99451b44SJordan Rupprecht self.assertFalse(val.TypeIsPointerType()) 56*99451b44SJordan Rupprecht content = process.ReadMemory( 57*99451b44SJordan Rupprecht val.AddressOf().GetValueAsUnsigned(), 1, error) 58*99451b44SJordan Rupprecht if not error.Success(): 59*99451b44SJordan Rupprecht self.fail("SBProcess.ReadMemory() failed") 60*99451b44SJordan Rupprecht if self.TraceOn(): 61*99451b44SJordan Rupprecht print("memory content:", content) 62*99451b44SJordan Rupprecht 63*99451b44SJordan Rupprecht self.expect( 64*99451b44SJordan Rupprecht content, 65*99451b44SJordan Rupprecht "Result from SBProcess.ReadMemory() matches our expected output: 'x'", 66*99451b44SJordan Rupprecht exe=False, 67*99451b44SJordan Rupprecht startstr=b'x') 68*99451b44SJordan Rupprecht 69*99451b44SJordan Rupprecht # Read (char *)my_char_ptr. 70*99451b44SJordan Rupprecht val = frame.FindValue("my_char_ptr", lldb.eValueTypeVariableGlobal) 71*99451b44SJordan Rupprecht self.DebugSBValue(val) 72*99451b44SJordan Rupprecht cstring = process.ReadCStringFromMemory( 73*99451b44SJordan Rupprecht val.GetValueAsUnsigned(), 256, error) 74*99451b44SJordan Rupprecht if not error.Success(): 75*99451b44SJordan Rupprecht self.fail("SBProcess.ReadCStringFromMemory() failed") 76*99451b44SJordan Rupprecht if self.TraceOn(): 77*99451b44SJordan Rupprecht print("cstring read is:", cstring) 78*99451b44SJordan Rupprecht 79*99451b44SJordan Rupprecht self.expect( 80*99451b44SJordan Rupprecht cstring, 81*99451b44SJordan Rupprecht "Result from SBProcess.ReadCStringFromMemory() matches our expected output", 82*99451b44SJordan Rupprecht exe=False, 83*99451b44SJordan Rupprecht startstr='Does it work?') 84*99451b44SJordan Rupprecht 85*99451b44SJordan Rupprecht # Get the SBValue for the global variable 'my_cstring'. 86*99451b44SJordan Rupprecht val = frame.FindValue("my_cstring", lldb.eValueTypeVariableGlobal) 87*99451b44SJordan Rupprecht self.DebugSBValue(val) 88*99451b44SJordan Rupprecht 89*99451b44SJordan Rupprecht # Due to the typemap magic (see lldb.swig), we pass in 256 to read at most 256 bytes 90*99451b44SJordan Rupprecht # from the address, and expect to get a Python string as the result 91*99451b44SJordan Rupprecht # object! 92*99451b44SJordan Rupprecht self.assertFalse(val.TypeIsPointerType()) 93*99451b44SJordan Rupprecht cstring = process.ReadCStringFromMemory( 94*99451b44SJordan Rupprecht val.AddressOf().GetValueAsUnsigned(), 256, error) 95*99451b44SJordan Rupprecht if not error.Success(): 96*99451b44SJordan Rupprecht self.fail("SBProcess.ReadCStringFromMemory() failed") 97*99451b44SJordan Rupprecht if self.TraceOn(): 98*99451b44SJordan Rupprecht print("cstring read is:", cstring) 99*99451b44SJordan Rupprecht 100*99451b44SJordan Rupprecht self.expect( 101*99451b44SJordan Rupprecht cstring, 102*99451b44SJordan Rupprecht "Result from SBProcess.ReadCStringFromMemory() matches our expected output", 103*99451b44SJordan Rupprecht exe=False, 104*99451b44SJordan Rupprecht startstr='lldb.SBProcess.ReadCStringFromMemory() works!') 105*99451b44SJordan Rupprecht 106*99451b44SJordan Rupprecht # Get the SBValue for the global variable 'my_uint32'. 107*99451b44SJordan Rupprecht val = frame.FindValue("my_uint32", lldb.eValueTypeVariableGlobal) 108*99451b44SJordan Rupprecht self.DebugSBValue(val) 109*99451b44SJordan Rupprecht 110*99451b44SJordan Rupprecht # Due to the typemap magic (see lldb.swig), we pass in 4 to read 4 bytes 111*99451b44SJordan Rupprecht # from the address, and expect to get an int as the result! 112*99451b44SJordan Rupprecht self.assertFalse(val.TypeIsPointerType()) 113*99451b44SJordan Rupprecht my_uint32 = process.ReadUnsignedFromMemory( 114*99451b44SJordan Rupprecht val.AddressOf().GetValueAsUnsigned(), 4, error) 115*99451b44SJordan Rupprecht if not error.Success(): 116*99451b44SJordan Rupprecht self.fail("SBProcess.ReadCStringFromMemory() failed") 117*99451b44SJordan Rupprecht if self.TraceOn(): 118*99451b44SJordan Rupprecht print("uint32 read is:", my_uint32) 119*99451b44SJordan Rupprecht 120*99451b44SJordan Rupprecht if my_uint32 != 12345: 121*99451b44SJordan Rupprecht self.fail( 122*99451b44SJordan Rupprecht "Result from SBProcess.ReadUnsignedFromMemory() does not match our expected output") 123*99451b44SJordan Rupprecht 124*99451b44SJordan Rupprecht @add_test_categories(['pyapi']) 125*99451b44SJordan Rupprecht def test_write_memory(self): 126*99451b44SJordan Rupprecht """Test Python SBProcess.WriteMemory() API.""" 127*99451b44SJordan Rupprecht self.build() 128*99451b44SJordan Rupprecht exe = self.getBuildArtifact("a.out") 129*99451b44SJordan Rupprecht 130*99451b44SJordan Rupprecht target = self.dbg.CreateTarget(exe) 131*99451b44SJordan Rupprecht self.assertTrue(target, VALID_TARGET) 132*99451b44SJordan Rupprecht 133*99451b44SJordan Rupprecht breakpoint = target.BreakpointCreateByLocation("main.cpp", self.line) 134*99451b44SJordan Rupprecht self.assertTrue(breakpoint, VALID_BREAKPOINT) 135*99451b44SJordan Rupprecht 136*99451b44SJordan Rupprecht # Launch the process, and do not stop at the entry point. 137*99451b44SJordan Rupprecht process = target.LaunchSimple( 138*99451b44SJordan Rupprecht None, None, self.get_process_working_directory()) 139*99451b44SJordan Rupprecht 140*99451b44SJordan Rupprecht thread = get_stopped_thread(process, lldb.eStopReasonBreakpoint) 141*99451b44SJordan Rupprecht self.assertTrue( 142*99451b44SJordan Rupprecht thread.IsValid(), 143*99451b44SJordan Rupprecht "There should be a thread stopped due to breakpoint") 144*99451b44SJordan Rupprecht frame = thread.GetFrameAtIndex(0) 145*99451b44SJordan Rupprecht 146*99451b44SJordan Rupprecht # Get the SBValue for the global variable 'my_char'. 147*99451b44SJordan Rupprecht val = frame.FindValue("my_char", lldb.eValueTypeVariableGlobal) 148*99451b44SJordan Rupprecht self.DebugSBValue(val) 149*99451b44SJordan Rupprecht 150*99451b44SJordan Rupprecht # If the variable does not have a load address, there's no sense 151*99451b44SJordan Rupprecht # continuing. 152*99451b44SJordan Rupprecht if not val.GetLocation().startswith("0x"): 153*99451b44SJordan Rupprecht return 154*99451b44SJordan Rupprecht 155*99451b44SJordan Rupprecht # OK, let's get the hex location of the variable. 156*99451b44SJordan Rupprecht location = int(val.GetLocation(), 16) 157*99451b44SJordan Rupprecht 158*99451b44SJordan Rupprecht # The program logic makes the 'my_char' variable to have memory content as 'x'. 159*99451b44SJordan Rupprecht # But we want to use the WriteMemory() API to assign 'a' to the 160*99451b44SJordan Rupprecht # variable. 161*99451b44SJordan Rupprecht 162*99451b44SJordan Rupprecht # Now use WriteMemory() API to write 'a' into the global variable. 163*99451b44SJordan Rupprecht error = lldb.SBError() 164*99451b44SJordan Rupprecht result = process.WriteMemory(location, 'a', error) 165*99451b44SJordan Rupprecht if not error.Success() or result != 1: 166*99451b44SJordan Rupprecht self.fail("SBProcess.WriteMemory() failed") 167*99451b44SJordan Rupprecht 168*99451b44SJordan Rupprecht # Read from the memory location. This time it should be 'a'. 169*99451b44SJordan Rupprecht # Due to the typemap magic (see lldb.swig), we pass in 1 to ReadMemory and 170*99451b44SJordan Rupprecht # expect to get a Python string as the result object! 171*99451b44SJordan Rupprecht content = process.ReadMemory(location, 1, error) 172*99451b44SJordan Rupprecht if not error.Success(): 173*99451b44SJordan Rupprecht self.fail("SBProcess.ReadMemory() failed") 174*99451b44SJordan Rupprecht if self.TraceOn(): 175*99451b44SJordan Rupprecht print("memory content:", content) 176*99451b44SJordan Rupprecht 177*99451b44SJordan Rupprecht self.expect( 178*99451b44SJordan Rupprecht content, 179*99451b44SJordan Rupprecht "Result from SBProcess.ReadMemory() matches our expected output: 'a'", 180*99451b44SJordan Rupprecht exe=False, 181*99451b44SJordan Rupprecht startstr=b'a') 182*99451b44SJordan Rupprecht 183*99451b44SJordan Rupprecht @add_test_categories(['pyapi']) 184*99451b44SJordan Rupprecht def test_access_my_int(self): 185*99451b44SJordan Rupprecht """Test access 'my_int' using Python SBProcess.GetByteOrder() and other APIs.""" 186*99451b44SJordan Rupprecht self.build() 187*99451b44SJordan Rupprecht exe = self.getBuildArtifact("a.out") 188*99451b44SJordan Rupprecht 189*99451b44SJordan Rupprecht target = self.dbg.CreateTarget(exe) 190*99451b44SJordan Rupprecht self.assertTrue(target, VALID_TARGET) 191*99451b44SJordan Rupprecht 192*99451b44SJordan Rupprecht breakpoint = target.BreakpointCreateByLocation("main.cpp", self.line) 193*99451b44SJordan Rupprecht self.assertTrue(breakpoint, VALID_BREAKPOINT) 194*99451b44SJordan Rupprecht 195*99451b44SJordan Rupprecht # Launch the process, and do not stop at the entry point. 196*99451b44SJordan Rupprecht process = target.LaunchSimple( 197*99451b44SJordan Rupprecht None, None, self.get_process_working_directory()) 198*99451b44SJordan Rupprecht 199*99451b44SJordan Rupprecht thread = get_stopped_thread(process, lldb.eStopReasonBreakpoint) 200*99451b44SJordan Rupprecht self.assertTrue( 201*99451b44SJordan Rupprecht thread.IsValid(), 202*99451b44SJordan Rupprecht "There should be a thread stopped due to breakpoint") 203*99451b44SJordan Rupprecht frame = thread.GetFrameAtIndex(0) 204*99451b44SJordan Rupprecht 205*99451b44SJordan Rupprecht # Get the SBValue for the global variable 'my_int'. 206*99451b44SJordan Rupprecht val = frame.FindValue("my_int", lldb.eValueTypeVariableGlobal) 207*99451b44SJordan Rupprecht self.DebugSBValue(val) 208*99451b44SJordan Rupprecht 209*99451b44SJordan Rupprecht # If the variable does not have a load address, there's no sense 210*99451b44SJordan Rupprecht # continuing. 211*99451b44SJordan Rupprecht if not val.GetLocation().startswith("0x"): 212*99451b44SJordan Rupprecht return 213*99451b44SJordan Rupprecht 214*99451b44SJordan Rupprecht # OK, let's get the hex location of the variable. 215*99451b44SJordan Rupprecht location = int(val.GetLocation(), 16) 216*99451b44SJordan Rupprecht 217*99451b44SJordan Rupprecht # Note that the canonical from of the bytearray is little endian. 218*99451b44SJordan Rupprecht from lldbsuite.test.lldbutil import int_to_bytearray, bytearray_to_int 219*99451b44SJordan Rupprecht 220*99451b44SJordan Rupprecht byteSize = val.GetByteSize() 221*99451b44SJordan Rupprecht bytes = int_to_bytearray(256, byteSize) 222*99451b44SJordan Rupprecht 223*99451b44SJordan Rupprecht byteOrder = process.GetByteOrder() 224*99451b44SJordan Rupprecht if byteOrder == lldb.eByteOrderBig: 225*99451b44SJordan Rupprecht bytes.reverse() 226*99451b44SJordan Rupprecht elif byteOrder == lldb.eByteOrderLittle: 227*99451b44SJordan Rupprecht pass 228*99451b44SJordan Rupprecht else: 229*99451b44SJordan Rupprecht # Neither big endian nor little endian? Return for now. 230*99451b44SJordan Rupprecht # Add more logic here if we want to handle other types. 231*99451b44SJordan Rupprecht return 232*99451b44SJordan Rupprecht 233*99451b44SJordan Rupprecht # The program logic makes the 'my_int' variable to have int type and value of 0. 234*99451b44SJordan Rupprecht # But we want to use the WriteMemory() API to assign 256 to the 235*99451b44SJordan Rupprecht # variable. 236*99451b44SJordan Rupprecht 237*99451b44SJordan Rupprecht # Now use WriteMemory() API to write 256 into the global variable. 238*99451b44SJordan Rupprecht error = lldb.SBError() 239*99451b44SJordan Rupprecht result = process.WriteMemory(location, bytes, error) 240*99451b44SJordan Rupprecht if not error.Success() or result != byteSize: 241*99451b44SJordan Rupprecht self.fail("SBProcess.WriteMemory() failed") 242*99451b44SJordan Rupprecht 243*99451b44SJordan Rupprecht # Make sure that the val we got originally updates itself to notice the 244*99451b44SJordan Rupprecht # change: 245*99451b44SJordan Rupprecht self.expect( 246*99451b44SJordan Rupprecht val.GetValue(), 247*99451b44SJordan Rupprecht "SBProcess.ReadMemory() successfully writes (int)256 to the memory location for 'my_int'", 248*99451b44SJordan Rupprecht exe=False, 249*99451b44SJordan Rupprecht startstr='256') 250*99451b44SJordan Rupprecht 251*99451b44SJordan Rupprecht # And for grins, get the SBValue for the global variable 'my_int' 252*99451b44SJordan Rupprecht # again, to make sure that also tracks the new value: 253*99451b44SJordan Rupprecht val = frame.FindValue("my_int", lldb.eValueTypeVariableGlobal) 254*99451b44SJordan Rupprecht self.expect( 255*99451b44SJordan Rupprecht val.GetValue(), 256*99451b44SJordan Rupprecht "SBProcess.ReadMemory() successfully writes (int)256 to the memory location for 'my_int'", 257*99451b44SJordan Rupprecht exe=False, 258*99451b44SJordan Rupprecht startstr='256') 259*99451b44SJordan Rupprecht 260*99451b44SJordan Rupprecht # Now read the memory content. The bytearray should have (byte)1 as 261*99451b44SJordan Rupprecht # the second element. 262*99451b44SJordan Rupprecht content = process.ReadMemory(location, byteSize, error) 263*99451b44SJordan Rupprecht if not error.Success(): 264*99451b44SJordan Rupprecht self.fail("SBProcess.ReadMemory() failed") 265*99451b44SJordan Rupprecht 266*99451b44SJordan Rupprecht # The bytearray_to_int utility function expects a little endian 267*99451b44SJordan Rupprecht # bytearray. 268*99451b44SJordan Rupprecht if byteOrder == lldb.eByteOrderBig: 269*99451b44SJordan Rupprecht content = bytearray(content, 'ascii') 270*99451b44SJordan Rupprecht content.reverse() 271*99451b44SJordan Rupprecht 272*99451b44SJordan Rupprecht new_value = bytearray_to_int(content, byteSize) 273*99451b44SJordan Rupprecht if new_value != 256: 274*99451b44SJordan Rupprecht self.fail("Memory content read from 'my_int' does not match (int)256") 275*99451b44SJordan Rupprecht 276*99451b44SJordan Rupprecht # Dump the memory content.... 277*99451b44SJordan Rupprecht if self.TraceOn(): 278*99451b44SJordan Rupprecht for i in content: 279*99451b44SJordan Rupprecht print("byte:", i) 280*99451b44SJordan Rupprecht 281*99451b44SJordan Rupprecht @add_test_categories(['pyapi']) 282*99451b44SJordan Rupprecht def test_remote_launch(self): 283*99451b44SJordan Rupprecht """Test SBProcess.RemoteLaunch() API with a process not in eStateConnected, and it should fail.""" 284*99451b44SJordan Rupprecht self.build() 285*99451b44SJordan Rupprecht exe = self.getBuildArtifact("a.out") 286*99451b44SJordan Rupprecht 287*99451b44SJordan Rupprecht target = self.dbg.CreateTarget(exe) 288*99451b44SJordan Rupprecht self.assertTrue(target, VALID_TARGET) 289*99451b44SJordan Rupprecht 290*99451b44SJordan Rupprecht # Launch the process, and do not stop at the entry point. 291*99451b44SJordan Rupprecht process = target.LaunchSimple( 292*99451b44SJordan Rupprecht None, None, self.get_process_working_directory()) 293*99451b44SJordan Rupprecht 294*99451b44SJordan Rupprecht if self.TraceOn(): 295*99451b44SJordan Rupprecht print("process state:", state_type_to_str(process.GetState())) 296*99451b44SJordan Rupprecht self.assertTrue(process.GetState() != lldb.eStateConnected) 297*99451b44SJordan Rupprecht 298*99451b44SJordan Rupprecht error = lldb.SBError() 299*99451b44SJordan Rupprecht success = process.RemoteLaunch( 300*99451b44SJordan Rupprecht None, None, None, None, None, None, 0, False, error) 301*99451b44SJordan Rupprecht self.assertTrue( 302*99451b44SJordan Rupprecht not success, 303*99451b44SJordan Rupprecht "RemoteLaunch() should fail for process state != eStateConnected") 304*99451b44SJordan Rupprecht 305*99451b44SJordan Rupprecht @add_test_categories(['pyapi']) 306*99451b44SJordan Rupprecht def test_get_num_supported_hardware_watchpoints(self): 307*99451b44SJordan Rupprecht """Test SBProcess.GetNumSupportedHardwareWatchpoints() API with a process.""" 308*99451b44SJordan Rupprecht self.build() 309*99451b44SJordan Rupprecht exe = self.getBuildArtifact("a.out") 310*99451b44SJordan Rupprecht self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET) 311*99451b44SJordan Rupprecht 312*99451b44SJordan Rupprecht target = self.dbg.CreateTarget(exe) 313*99451b44SJordan Rupprecht self.assertTrue(target, VALID_TARGET) 314*99451b44SJordan Rupprecht 315*99451b44SJordan Rupprecht breakpoint = target.BreakpointCreateByLocation("main.cpp", self.line) 316*99451b44SJordan Rupprecht self.assertTrue(breakpoint, VALID_BREAKPOINT) 317*99451b44SJordan Rupprecht 318*99451b44SJordan Rupprecht # Launch the process, and do not stop at the entry point. 319*99451b44SJordan Rupprecht process = target.LaunchSimple( 320*99451b44SJordan Rupprecht None, None, self.get_process_working_directory()) 321*99451b44SJordan Rupprecht 322*99451b44SJordan Rupprecht error = lldb.SBError() 323*99451b44SJordan Rupprecht num = process.GetNumSupportedHardwareWatchpoints(error) 324*99451b44SJordan Rupprecht if self.TraceOn() and error.Success(): 325*99451b44SJordan Rupprecht print("Number of supported hardware watchpoints: %d" % num) 326*99451b44SJordan Rupprecht 327*99451b44SJordan Rupprecht @add_test_categories(['pyapi']) 328*99451b44SJordan Rupprecht @no_debug_info_test 329*99451b44SJordan Rupprecht def test_get_process_info(self): 330*99451b44SJordan Rupprecht """Test SBProcess::GetProcessInfo() API with a locally launched process.""" 331*99451b44SJordan Rupprecht self.build() 332*99451b44SJordan Rupprecht exe = self.getBuildArtifact("a.out") 333*99451b44SJordan Rupprecht self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET) 334*99451b44SJordan Rupprecht 335*99451b44SJordan Rupprecht target = self.dbg.CreateTarget(exe) 336*99451b44SJordan Rupprecht self.assertTrue(target, VALID_TARGET) 337*99451b44SJordan Rupprecht 338*99451b44SJordan Rupprecht # Launch the process and stop at the entry point. 339*99451b44SJordan Rupprecht launch_info = lldb.SBLaunchInfo(None) 340*99451b44SJordan Rupprecht launch_info.SetWorkingDirectory(self.get_process_working_directory()) 341*99451b44SJordan Rupprecht launch_flags = launch_info.GetLaunchFlags() 342*99451b44SJordan Rupprecht launch_flags |= lldb.eLaunchFlagStopAtEntry 343*99451b44SJordan Rupprecht launch_info.SetLaunchFlags(launch_flags) 344*99451b44SJordan Rupprecht error = lldb.SBError() 345*99451b44SJordan Rupprecht process = target.Launch(launch_info, error) 346*99451b44SJordan Rupprecht 347*99451b44SJordan Rupprecht if not error.Success(): 348*99451b44SJordan Rupprecht self.fail("Failed to launch process") 349*99451b44SJordan Rupprecht 350*99451b44SJordan Rupprecht # Verify basic process info can be retrieved successfully 351*99451b44SJordan Rupprecht process_info = process.GetProcessInfo() 352*99451b44SJordan Rupprecht self.assertTrue(process_info.IsValid()) 353*99451b44SJordan Rupprecht file_spec = process_info.GetExecutableFile() 354*99451b44SJordan Rupprecht self.assertTrue(file_spec.IsValid()) 355*99451b44SJordan Rupprecht process_name = process_info.GetName() 356*99451b44SJordan Rupprecht self.assertIsNotNone(process_name, "Process has a name") 357*99451b44SJordan Rupprecht self.assertGreater(len(process_name), 0, "Process name isn't blank") 358*99451b44SJordan Rupprecht self.assertEqual(file_spec.GetFilename(), "a.out") 359*99451b44SJordan Rupprecht self.assertNotEqual( 360*99451b44SJordan Rupprecht process_info.GetProcessID(), lldb.LLDB_INVALID_PROCESS_ID, 361*99451b44SJordan Rupprecht "Process ID is valid") 362*99451b44SJordan Rupprecht 363*99451b44SJordan Rupprecht # Additional process info varies by platform, so just check that 364*99451b44SJordan Rupprecht # whatever info was retrieved is consistent and nothing blows up. 365*99451b44SJordan Rupprecht if process_info.UserIDIsValid(): 366*99451b44SJordan Rupprecht self.assertNotEqual( 367*99451b44SJordan Rupprecht process_info.GetUserID(), lldb.UINT32_MAX, 368*99451b44SJordan Rupprecht "Process user ID is valid") 369*99451b44SJordan Rupprecht else: 370*99451b44SJordan Rupprecht self.assertEqual( 371*99451b44SJordan Rupprecht process_info.GetUserID(), lldb.UINT32_MAX, 372*99451b44SJordan Rupprecht "Process user ID is invalid") 373*99451b44SJordan Rupprecht 374*99451b44SJordan Rupprecht if process_info.GroupIDIsValid(): 375*99451b44SJordan Rupprecht self.assertNotEqual( 376*99451b44SJordan Rupprecht process_info.GetGroupID(), lldb.UINT32_MAX, 377*99451b44SJordan Rupprecht "Process group ID is valid") 378*99451b44SJordan Rupprecht else: 379*99451b44SJordan Rupprecht self.assertEqual( 380*99451b44SJordan Rupprecht process_info.GetGroupID(), lldb.UINT32_MAX, 381*99451b44SJordan Rupprecht "Process group ID is invalid") 382*99451b44SJordan Rupprecht 383*99451b44SJordan Rupprecht if process_info.EffectiveUserIDIsValid(): 384*99451b44SJordan Rupprecht self.assertNotEqual( 385*99451b44SJordan Rupprecht process_info.GetEffectiveUserID(), lldb.UINT32_MAX, 386*99451b44SJordan Rupprecht "Process effective user ID is valid") 387*99451b44SJordan Rupprecht else: 388*99451b44SJordan Rupprecht self.assertEqual( 389*99451b44SJordan Rupprecht process_info.GetEffectiveUserID(), lldb.UINT32_MAX, 390*99451b44SJordan Rupprecht "Process effective user ID is invalid") 391*99451b44SJordan Rupprecht 392*99451b44SJordan Rupprecht if process_info.EffectiveGroupIDIsValid(): 393*99451b44SJordan Rupprecht self.assertNotEqual( 394*99451b44SJordan Rupprecht process_info.GetEffectiveGroupID(), lldb.UINT32_MAX, 395*99451b44SJordan Rupprecht "Process effective group ID is valid") 396*99451b44SJordan Rupprecht else: 397*99451b44SJordan Rupprecht self.assertEqual( 398*99451b44SJordan Rupprecht process_info.GetEffectiveGroupID(), lldb.UINT32_MAX, 399*99451b44SJordan Rupprecht "Process effective group ID is invalid") 400*99451b44SJordan Rupprecht 401*99451b44SJordan Rupprecht process_info.GetParentProcessID() 402