103df9710SRumeet Dhindsa""" 203df9710SRumeet DhindsaTest that LLDB can launch a linux executable through the dynamic loader and still hit a breakpoint. 303df9710SRumeet Dhindsa""" 403df9710SRumeet Dhindsa 503df9710SRumeet Dhindsaimport lldb 603df9710SRumeet Dhindsaimport os 703df9710SRumeet Dhindsa 803df9710SRumeet Dhindsafrom lldbsuite.test.decorators import * 903df9710SRumeet Dhindsafrom lldbsuite.test.lldbtest import * 1003df9710SRumeet Dhindsa 1103df9710SRumeet Dhindsaclass TestLinux64LaunchingViaDynamicLoader(TestBase): 1203df9710SRumeet Dhindsa 1303df9710SRumeet Dhindsa @skipIf(oslist=no_match(['linux'])) 1403df9710SRumeet Dhindsa @no_debug_info_test 15c55e021dSMuhammad Omair Javaid @skipIf(oslist=["linux"], archs=["arm"]) 1603df9710SRumeet Dhindsa def test(self): 1703df9710SRumeet Dhindsa self.build() 1803df9710SRumeet Dhindsa 1903df9710SRumeet Dhindsa # Extracts path of the interpreter. 2003df9710SRumeet Dhindsa spec = lldb.SBModuleSpec() 2103df9710SRumeet Dhindsa spec.SetFileSpec(lldb.SBFileSpec(self.getBuildArtifact("a.out"))) 2203df9710SRumeet Dhindsa interp_section = lldb.SBModule(spec).FindSection(".interp") 2303df9710SRumeet Dhindsa if not interp_section: 2403df9710SRumeet Dhindsa return 2503df9710SRumeet Dhindsa section_data = interp_section.GetSectionData() 2603df9710SRumeet Dhindsa error = lldb.SBError() 2703df9710SRumeet Dhindsa exe = section_data.GetString(error,0) 2803df9710SRumeet Dhindsa if error.Fail(): 2903df9710SRumeet Dhindsa return 3003df9710SRumeet Dhindsa 3103df9710SRumeet Dhindsa target = self.dbg.CreateTarget(exe) 3203df9710SRumeet Dhindsa self.assertTrue(target, VALID_TARGET) 3303df9710SRumeet Dhindsa 3403df9710SRumeet Dhindsa # Set breakpoints both on shared library function as well as on 3503df9710SRumeet Dhindsa # main. Both of them will be pending breakpoints. 3603df9710SRumeet Dhindsa breakpoint_main = target.BreakpointCreateBySourceRegex("// Break here", lldb.SBFileSpec("main.cpp")) 3703df9710SRumeet Dhindsa breakpoint_shared_library = target.BreakpointCreateBySourceRegex("get_signal_crash", lldb.SBFileSpec("signal_file.cpp")) 3803df9710SRumeet Dhindsa launch_info = lldb.SBLaunchInfo([ "--library-path", self.get_process_working_directory(), self.getBuildArtifact("a.out")]) 3903df9710SRumeet Dhindsa launch_info.SetWorkingDirectory(self.get_process_working_directory()) 4003df9710SRumeet Dhindsa error = lldb.SBError() 4103df9710SRumeet Dhindsa process = target.Launch(launch_info, error) 42779bbbf2SDave Lee self.assertSuccess(error) 4303df9710SRumeet Dhindsa 4403df9710SRumeet Dhindsa # Stopped on main here. 4547c4c6a7SDave Lee self.assertState(process.GetState(), lldb.eStateStopped) 4603df9710SRumeet Dhindsa thread = process.GetSelectedThread() 4703df9710SRumeet Dhindsa self.assertIn("main", thread.GetFrameAtIndex(0).GetDisplayFunctionName()) 4803df9710SRumeet Dhindsa process.Continue() 4903df9710SRumeet Dhindsa 5003df9710SRumeet Dhindsa # Stopped on get_signal_crash function here. 5147c4c6a7SDave Lee self.assertState(process.GetState(), lldb.eStateStopped) 5203df9710SRumeet Dhindsa self.assertIn("get_signal_crash", thread.GetFrameAtIndex(0).GetDisplayFunctionName()) 5303df9710SRumeet Dhindsa process.Continue() 5403df9710SRumeet Dhindsa 5503df9710SRumeet Dhindsa # Stopped because of generated signal. 5647c4c6a7SDave Lee self.assertState(process.GetState(), lldb.eStateStopped) 57*1f9f7a2fSPavel Labath self.assertIn("raise", lldbutil.get_function_names(thread)) 58