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