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 * 10*ac42f768SDmitry Vasilyevfrom lldbsuite.test import lldbutil 1103df9710SRumeet Dhindsa 1203df9710SRumeet Dhindsa 132238dcc3SJonas Devlieghereclass TestLinux64LaunchingViaDynamicLoader(TestBase): 142238dcc3SJonas Devlieghere @skipIf(oslist=no_match(["linux"])) 1503df9710SRumeet Dhindsa @no_debug_info_test 16c55e021dSMuhammad Omair Javaid @skipIf(oslist=["linux"], archs=["arm"]) 1703df9710SRumeet Dhindsa def test(self): 1803df9710SRumeet Dhindsa self.build() 1903df9710SRumeet Dhindsa 2003df9710SRumeet Dhindsa # Extracts path of the interpreter. 2103df9710SRumeet Dhindsa spec = lldb.SBModuleSpec() 2203df9710SRumeet Dhindsa spec.SetFileSpec(lldb.SBFileSpec(self.getBuildArtifact("a.out"))) 2303df9710SRumeet Dhindsa interp_section = lldb.SBModule(spec).FindSection(".interp") 2403df9710SRumeet Dhindsa if not interp_section: 2503df9710SRumeet Dhindsa return 2603df9710SRumeet Dhindsa section_data = interp_section.GetSectionData() 2703df9710SRumeet Dhindsa error = lldb.SBError() 2803df9710SRumeet Dhindsa exe = section_data.GetString(error, 0) 2903df9710SRumeet Dhindsa if error.Fail(): 3003df9710SRumeet Dhindsa return 3103df9710SRumeet Dhindsa 3203df9710SRumeet Dhindsa target = self.dbg.CreateTarget(exe) 3303df9710SRumeet Dhindsa self.assertTrue(target, VALID_TARGET) 3403df9710SRumeet Dhindsa 3503df9710SRumeet Dhindsa # Set breakpoints both on shared library function as well as on 3603df9710SRumeet Dhindsa # main. Both of them will be pending breakpoints. 372238dcc3SJonas Devlieghere breakpoint_main = target.BreakpointCreateBySourceRegex( 382238dcc3SJonas Devlieghere "// Break here", lldb.SBFileSpec("main.cpp") 392238dcc3SJonas Devlieghere ) 402238dcc3SJonas Devlieghere breakpoint_shared_library = target.BreakpointCreateBySourceRegex( 412238dcc3SJonas Devlieghere "get_signal_crash", lldb.SBFileSpec("signal_file.cpp") 422238dcc3SJonas Devlieghere ) 43*ac42f768SDmitry Vasilyev inferior_exe_path = lldbutil.install_to_target( 44*ac42f768SDmitry Vasilyev self, self.getBuildArtifact("a.out") 45*ac42f768SDmitry Vasilyev ) 46*ac42f768SDmitry Vasilyev lldbutil.install_to_target(self, self.getBuildArtifact("libsignal_file.so")) 47*ac42f768SDmitry Vasilyev 482238dcc3SJonas Devlieghere launch_info = lldb.SBLaunchInfo( 492238dcc3SJonas Devlieghere [ 502238dcc3SJonas Devlieghere "--library-path", 512238dcc3SJonas Devlieghere self.get_process_working_directory(), 52*ac42f768SDmitry Vasilyev inferior_exe_path, 532238dcc3SJonas Devlieghere ] 542238dcc3SJonas Devlieghere ) 5503df9710SRumeet Dhindsa launch_info.SetWorkingDirectory(self.get_process_working_directory()) 5603df9710SRumeet Dhindsa error = lldb.SBError() 5703df9710SRumeet Dhindsa process = target.Launch(launch_info, error) 58779bbbf2SDave Lee self.assertSuccess(error) 5903df9710SRumeet Dhindsa 6003df9710SRumeet Dhindsa # Stopped on main here. 6147c4c6a7SDave Lee self.assertState(process.GetState(), lldb.eStateStopped) 6203df9710SRumeet Dhindsa thread = process.GetSelectedThread() 6303df9710SRumeet Dhindsa self.assertIn("main", thread.GetFrameAtIndex(0).GetDisplayFunctionName()) 6403df9710SRumeet Dhindsa process.Continue() 6503df9710SRumeet Dhindsa 6603df9710SRumeet Dhindsa # Stopped on get_signal_crash function here. 6747c4c6a7SDave Lee self.assertState(process.GetState(), lldb.eStateStopped) 682238dcc3SJonas Devlieghere self.assertIn( 692238dcc3SJonas Devlieghere "get_signal_crash", thread.GetFrameAtIndex(0).GetDisplayFunctionName() 702238dcc3SJonas Devlieghere ) 7103df9710SRumeet Dhindsa process.Continue() 7203df9710SRumeet Dhindsa 7303df9710SRumeet Dhindsa # Stopped because of generated signal. 7447c4c6a7SDave Lee self.assertState(process.GetState(), lldb.eStateStopped) 751f9f7a2fSPavel Labath self.assertIn("raise", lldbutil.get_function_names(thread)) 76