192eaad2dSJim Inghamimport lldb 292eaad2dSJim Inghamfrom lldbsuite.test.lldbtest import * 392eaad2dSJim Inghamfrom lldbsuite.test.decorators import * 492eaad2dSJim Inghamfrom lldbsuite.test.gdbclientutils import * 592eaad2dSJim Inghamfrom lldbsuite.test.lldbgdbclient import GDBRemoteTestBase 692eaad2dSJim Ingham 792eaad2dSJim Inghamclass TestNoLocalFile(GDBRemoteTestBase): 892eaad2dSJim Ingham """ Test the case where there is NO local copy of the file 992eaad2dSJim Ingham being debugged. We shouldn't immediately error out, but 1092eaad2dSJim Ingham rather lldb should ask debugserver if it knows about the file. """ 1192eaad2dSJim Ingham 1292eaad2dSJim Ingham @skipIfXmlSupportMissing 132a21700bSJim Ingham def test_with_python(self): 142a21700bSJim Ingham self.do_test(False) 152a21700bSJim Ingham @skipIfXmlSupportMissing 162a21700bSJim Ingham def test_with_target_ceate(self): 172a21700bSJim Ingham self.do_test(True) 182a21700bSJim Ingham 192a21700bSJim Ingham def do_test(self, use_target_create): 2092eaad2dSJim Ingham self.absent_file = '/nosuch_dir/nosuch_subdir/nosuch_executable' 2192eaad2dSJim Ingham self.a_packet_file = None 2292eaad2dSJim Ingham class MyResponder(MockGDBServerResponder): 2392eaad2dSJim Ingham def __init__(self, testcase): 2492eaad2dSJim Ingham MockGDBServerResponder.__init__(self) 2592eaad2dSJim Ingham self.after_launch = False 2692eaad2dSJim Ingham self.testcase = testcase 2792eaad2dSJim Ingham self.current_thread = 0 2892eaad2dSJim Ingham 2992eaad2dSJim Ingham def A(self, packet): 3092eaad2dSJim Ingham # This is the main test, we want to see that lldb DID send the 3192eaad2dSJim Ingham # A packet to get debugserver to load the file. 3292eaad2dSJim Ingham # Skip the length and second length: 3392eaad2dSJim Ingham print("Got A packet: {0}".format(packet)) 3492eaad2dSJim Ingham a_arr = packet.split(",") 3592eaad2dSJim Ingham self.testcase.a_packet_file = bytearray.fromhex(a_arr[2]).decode() 3692eaad2dSJim Ingham return "OK" 3792eaad2dSJim Ingham 3892eaad2dSJim Ingham def qXferRead(self, obj, annex, offset, length): 3992eaad2dSJim Ingham if annex == "target.xml": 4092eaad2dSJim Ingham return """<?xml version="1.0"?> 4192eaad2dSJim Ingham <target version="1.0"> 4292eaad2dSJim Ingham <architecture>i386:x86-64</architecture> 4392eaad2dSJim Ingham <feature name="org.gnu.gdb.i386.core"> 4492eaad2dSJim Ingham <reg name="rip" bitsize="64" regnum="0" type="code_ptr" group="general"/> 4592eaad2dSJim Ingham </feature> 4692eaad2dSJim Ingham </target>""", False 4792eaad2dSJim Ingham else: 4892eaad2dSJim Ingham return None, False 4992eaad2dSJim Ingham 5092eaad2dSJim Ingham def qC(self): 5192eaad2dSJim Ingham if not self.after_launch: 5292eaad2dSJim Ingham return "QC0" 5392eaad2dSJim Ingham return "0" 5492eaad2dSJim Ingham 5592eaad2dSJim Ingham def qfThreadInfo(self): 5692eaad2dSJim Ingham if not self.after_launch: 5792eaad2dSJim Ingham return "OK" 5892eaad2dSJim Ingham return "m0" 5992eaad2dSJim Ingham 6092eaad2dSJim Ingham def qsThreadInfo(self): 6192eaad2dSJim Ingham if not self.after_launch: 6292eaad2dSJim Ingham return "OK" 6392eaad2dSJim Ingham return "l" 6492eaad2dSJim Ingham 6592eaad2dSJim Ingham def qLaunchSuccess(self): 6692eaad2dSJim Ingham return "OK" 6792eaad2dSJim Ingham 6892eaad2dSJim Ingham def qProcessInfo(self): 6992eaad2dSJim Ingham return "$pid:10b70;parent-pid:10b20;real-uid:1f6;real-gid:14;effective-uid:1f6;effective-gid:14;cputype:1000007;cpusubtype:8;ptrsize:8;ostype:macosx;vendor:apple;endian:little;" 7092eaad2dSJim Ingham 7192eaad2dSJim Ingham 7292eaad2dSJim Ingham error = lldb.SBError() 7392eaad2dSJim Ingham self.server.responder = MyResponder(self) 742a21700bSJim Ingham target = lldb.SBTarget() 752a21700bSJim Ingham if (use_target_create): 762a21700bSJim Ingham create_cmd = "target create --arch x86_64-apple-macosx --platform remote-macosx --remote-file {0}".format(self.absent_file) 772a21700bSJim Ingham self.runCmd(create_cmd) 782a21700bSJim Ingham target = self.dbg.GetSelectedTarget() 792a21700bSJim Ingham self.assertTrue(target.IsValid(), "Made a valid target") 802a21700bSJim Ingham else: 8192eaad2dSJim Ingham target = self.dbg.CreateTarget(None, "x86_64-apple-macosx", "remote-macosx", False, error) 8292eaad2dSJim Ingham self.assertSuccess(error, "Made a valid target") 832a21700bSJim Ingham 8492eaad2dSJim Ingham launch_info = target.GetLaunchInfo() 852a21700bSJim Ingham if (not use_target_create): 8692eaad2dSJim Ingham launch_info.SetExecutableFile(lldb.SBFileSpec(self.absent_file), True) 8792eaad2dSJim Ingham flags = launch_info.GetLaunchFlags() 8892eaad2dSJim Ingham flags |= lldb.eLaunchFlagStopAtEntry 8992eaad2dSJim Ingham launch_info.SetLaunchFlags(flags) 9092eaad2dSJim Ingham 9192eaad2dSJim Ingham process = self.connect(target) 9292eaad2dSJim Ingham self.assertTrue(process.IsValid(), "Process is valid") 9392eaad2dSJim Ingham 9492eaad2dSJim Ingham # We need to fetch the connected event: 9592eaad2dSJim Ingham lldbutil.expect_state_changes(self, self.dbg.GetListener(), process, [lldb.eStateConnected]) 9692eaad2dSJim Ingham 9792eaad2dSJim Ingham self.server.responder.after_launch = True 9892eaad2dSJim Ingham 9992eaad2dSJim Ingham process = target.Launch(launch_info, error) 10092eaad2dSJim Ingham 10192eaad2dSJim Ingham self.assertSuccess(error, "Successfully launched.") 102*47c4c6a7SDave Lee self.assertState(process.GetState(), lldb.eStateStopped, "Should be stopped at entry") 10392eaad2dSJim Ingham self.assertIsNotNone(self.a_packet_file, "A packet was sent") 10492eaad2dSJim Ingham self.assertEqual(self.absent_file, self.a_packet_file, "The A packet file was correct") 105