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 7*2238dcc3SJonas Devlieghere 892eaad2dSJim Inghamclass TestNoLocalFile(GDBRemoteTestBase): 992eaad2dSJim Ingham """Test the case where there is NO local copy of the file 1092eaad2dSJim Ingham being debugged. We shouldn't immediately error out, but 1192eaad2dSJim Ingham rather lldb should ask debugserver if it knows about the file.""" 1292eaad2dSJim Ingham 1392eaad2dSJim Ingham @skipIfXmlSupportMissing 142a21700bSJim Ingham def test_with_python(self): 152a21700bSJim Ingham self.do_test(False) 16*2238dcc3SJonas Devlieghere 172a21700bSJim Ingham @skipIfXmlSupportMissing 182a21700bSJim Ingham def test_with_target_ceate(self): 192a21700bSJim Ingham self.do_test(True) 202a21700bSJim Ingham 212a21700bSJim Ingham def do_test(self, use_target_create): 22*2238dcc3SJonas Devlieghere self.absent_file = "/nosuch_dir/nosuch_subdir/nosuch_executable" 2392eaad2dSJim Ingham self.a_packet_file = None 24*2238dcc3SJonas Devlieghere 2592eaad2dSJim Ingham class MyResponder(MockGDBServerResponder): 2692eaad2dSJim Ingham def __init__(self, testcase): 2792eaad2dSJim Ingham MockGDBServerResponder.__init__(self) 2892eaad2dSJim Ingham self.after_launch = False 2992eaad2dSJim Ingham self.testcase = testcase 3092eaad2dSJim Ingham self.current_thread = 0 3192eaad2dSJim Ingham 3292eaad2dSJim Ingham def A(self, packet): 3392eaad2dSJim Ingham # This is the main test, we want to see that lldb DID send the 3492eaad2dSJim Ingham # A packet to get debugserver to load the file. 3592eaad2dSJim Ingham # Skip the length and second length: 3692eaad2dSJim Ingham print("Got A packet: {0}".format(packet)) 3792eaad2dSJim Ingham a_arr = packet.split(",") 3892eaad2dSJim Ingham self.testcase.a_packet_file = bytearray.fromhex(a_arr[2]).decode() 3992eaad2dSJim Ingham return "OK" 4092eaad2dSJim Ingham 4192eaad2dSJim Ingham def qXferRead(self, obj, annex, offset, length): 4292eaad2dSJim Ingham if annex == "target.xml": 43*2238dcc3SJonas Devlieghere return ( 44*2238dcc3SJonas Devlieghere """<?xml version="1.0"?> 4592eaad2dSJim Ingham <target version="1.0"> 4692eaad2dSJim Ingham <architecture>i386:x86-64</architecture> 4792eaad2dSJim Ingham <feature name="org.gnu.gdb.i386.core"> 4892eaad2dSJim Ingham <reg name="rip" bitsize="64" regnum="0" type="code_ptr" group="general"/> 4992eaad2dSJim Ingham </feature> 50*2238dcc3SJonas Devlieghere </target>""", 51*2238dcc3SJonas Devlieghere False, 52*2238dcc3SJonas Devlieghere ) 5392eaad2dSJim Ingham else: 5492eaad2dSJim Ingham return None, False 5592eaad2dSJim Ingham 5692eaad2dSJim Ingham def qC(self): 5792eaad2dSJim Ingham if not self.after_launch: 5892eaad2dSJim Ingham return "QC0" 5992eaad2dSJim Ingham return "0" 6092eaad2dSJim Ingham 6192eaad2dSJim Ingham def qfThreadInfo(self): 6292eaad2dSJim Ingham if not self.after_launch: 6392eaad2dSJim Ingham return "OK" 6492eaad2dSJim Ingham return "m0" 6592eaad2dSJim Ingham 6692eaad2dSJim Ingham def qsThreadInfo(self): 6792eaad2dSJim Ingham if not self.after_launch: 6892eaad2dSJim Ingham return "OK" 6992eaad2dSJim Ingham return "l" 7092eaad2dSJim Ingham 7192eaad2dSJim Ingham def qLaunchSuccess(self): 7292eaad2dSJim Ingham return "OK" 7392eaad2dSJim Ingham 7492eaad2dSJim Ingham def qProcessInfo(self): 7592eaad2dSJim 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;" 7692eaad2dSJim Ingham 7792eaad2dSJim Ingham error = lldb.SBError() 7892eaad2dSJim Ingham self.server.responder = MyResponder(self) 792a21700bSJim Ingham target = lldb.SBTarget() 80*2238dcc3SJonas Devlieghere if use_target_create: 81*2238dcc3SJonas Devlieghere create_cmd = "target create --arch x86_64-apple-macosx --platform remote-macosx --remote-file {0}".format( 82*2238dcc3SJonas Devlieghere self.absent_file 83*2238dcc3SJonas Devlieghere ) 842a21700bSJim Ingham self.runCmd(create_cmd) 852a21700bSJim Ingham target = self.dbg.GetSelectedTarget() 862a21700bSJim Ingham self.assertTrue(target.IsValid(), "Made a valid target") 872a21700bSJim Ingham else: 88*2238dcc3SJonas Devlieghere target = self.dbg.CreateTarget( 89*2238dcc3SJonas Devlieghere None, "x86_64-apple-macosx", "remote-macosx", False, error 90*2238dcc3SJonas Devlieghere ) 9192eaad2dSJim Ingham self.assertSuccess(error, "Made a valid target") 922a21700bSJim Ingham 9392eaad2dSJim Ingham launch_info = target.GetLaunchInfo() 94*2238dcc3SJonas Devlieghere if not use_target_create: 9592eaad2dSJim Ingham launch_info.SetExecutableFile(lldb.SBFileSpec(self.absent_file), True) 9692eaad2dSJim Ingham flags = launch_info.GetLaunchFlags() 9792eaad2dSJim Ingham flags |= lldb.eLaunchFlagStopAtEntry 9892eaad2dSJim Ingham launch_info.SetLaunchFlags(flags) 9992eaad2dSJim Ingham 10092eaad2dSJim Ingham process = self.connect(target) 10192eaad2dSJim Ingham self.assertTrue(process.IsValid(), "Process is valid") 10292eaad2dSJim Ingham 10392eaad2dSJim Ingham # We need to fetch the connected event: 104*2238dcc3SJonas Devlieghere lldbutil.expect_state_changes( 105*2238dcc3SJonas Devlieghere self, self.dbg.GetListener(), process, [lldb.eStateConnected] 106*2238dcc3SJonas Devlieghere ) 10792eaad2dSJim Ingham 10892eaad2dSJim Ingham self.server.responder.after_launch = True 10992eaad2dSJim Ingham 11092eaad2dSJim Ingham process = target.Launch(launch_info, error) 11192eaad2dSJim Ingham 11292eaad2dSJim Ingham self.assertSuccess(error, "Successfully launched.") 113*2238dcc3SJonas Devlieghere self.assertState( 114*2238dcc3SJonas Devlieghere process.GetState(), lldb.eStateStopped, "Should be stopped at entry" 115*2238dcc3SJonas Devlieghere ) 11692eaad2dSJim Ingham self.assertIsNotNone(self.a_packet_file, "A packet was sent") 117*2238dcc3SJonas Devlieghere self.assertEqual( 118*2238dcc3SJonas Devlieghere self.absent_file, self.a_packet_file, "The A packet file was correct" 119*2238dcc3SJonas Devlieghere ) 120