brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.9 KiB · 80b0428 Raw
80 lines · python
1"""2Test that we read the function starts section.3"""4 5 6import lldb7from lldbsuite.test.decorators import *8from lldbsuite.test.lldbtest import *9from lldbsuite.test import lldbutil10 11exe_name = "StripMe"  # Must match Makefile12 13 14class FunctionStartsTestCase(TestBase):15    NO_DEBUG_INFO_TESTCASE = True16 17    @skipIfRemote18    @skipUnlessDarwin19    @skipIf(compiler="clang", compiler_version=["<", "13.0"])20    def test_function_starts_binary(self):21        """Test that we make synthetic symbols when we have the binary."""22        self.build(dictionary={"CODESIGN": ""})  # Binary is getting stripped later.23        self.do_function_starts(False)24 25    @skipIfRemote26    @skipUnlessDarwin27    @skipIf(compiler="clang", compiler_version=["<", "13.0"])28    def test_function_starts_no_binary(self):29        """Test that we make synthetic symbols when we don't have the binary"""30        self.build(dictionary={"CODESIGN": ""})  # Binary is getting stripped later.31        self.do_function_starts(True)32 33    def do_function_starts(self, in_memory):34        """Run the binary, stop at our unstripped function,35        make sure the caller has synthetic symbols"""36 37        exe = os.path.realpath(self.getBuildArtifact(exe_name))38        # Now strip the binary, but leave externals so we can break on dont_strip_me.39        self.runBuildCommand(["strip", "-u", "-x", "-S", exe])40 41        # Use a file as a synchronization point between test and inferior.42        pid_file_path = lldbutil.append_to_process_working_directory(43            self, "token_pid_%d" % (int(os.getpid()))44        )45        self.addTearDownHook(46            lambda: self.run_platform_command("rm %s" % (pid_file_path))47        )48 49        popen = self.spawnSubprocess(exe, [pid_file_path])50 51        # Wait until process has fully started up.52        pid = lldbutil.wait_for_file_on_target(self, pid_file_path)53 54        if in_memory:55            remove_file(exe)56 57        target = self.dbg.CreateTarget(None)58        self.assertTrue(target.IsValid(), "Got a vaid empty target.")59        error = lldb.SBError()60        attach_info = lldb.SBAttachInfo()61        attach_info.SetProcessID(popen.pid)62        attach_info.SetIgnoreExisting(False)63        process = target.Attach(attach_info, error)64        self.assertSuccess(error, "Didn't attach successfully to %d" % (popen.pid))65 66        bkpt = target.BreakpointCreateByName("dont_strip_me", exe)67        self.assertGreater(68            bkpt.GetNumLocations(), 0, "Didn't set the dont_strip_me bkpt."69        )70 71        threads = lldbutil.continue_to_breakpoint(process, bkpt)72        self.assertEqual(len(threads), 1, "Didn't hit my breakpoint.")73 74        # Our caller frame should have been stripped.  Make sure we made a synthetic symbol75        # for it:76        thread = threads[0]77        self.assertGreater(thread.num_frames, 1, "Couldn't backtrace.")78        name = thread.frame[1].GetFunctionName()79        self.assertTrue(name.startswith("___lldb_unnamed_symbol"))80