xref: /llvm-project/lldb/test/API/functionalities/dyld-launch-linux/TestDyldLaunchLinux.py (revision ac42f7689d741feda2badc438101e7952db048f3)
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