xref: /llvm-project/lldb/test/API/macosx/lc-note/kern-ver-str/TestKernVerStrLCNOTE.py (revision 1eeeab82c6eb185f5139e633a59c2dbcb15616e4)
199451b44SJordan Rupprecht"""Test that corefiles with an LC_NOTE "kern ver str" load command is used."""
299451b44SJordan Rupprecht
399451b44SJordan Rupprecht
499451b44SJordan Rupprechtimport os
599451b44SJordan Rupprechtimport re
699451b44SJordan Rupprechtimport subprocess
799451b44SJordan Rupprecht
899451b44SJordan Rupprechtimport lldb
999451b44SJordan Rupprechtfrom lldbsuite.test.decorators import *
1099451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import *
1199451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil
1299451b44SJordan Rupprecht
1399451b44SJordan Rupprecht
1499451b44SJordan Rupprechtclass TestKernVerStrLCNOTE(TestBase):
152238dcc3SJonas Devlieghere    @skipIf(
162238dcc3SJonas Devlieghere        debug_info=no_match(["dsym"]),
172238dcc3SJonas Devlieghere        bugnumber="This test is looking explicitly for a dSYM",
182238dcc3SJonas Devlieghere    )
192238dcc3SJonas Devlieghere    @skipIf(archs=no_match(["x86_64"]))
2099451b44SJordan Rupprecht    @skipUnlessDarwin
2199451b44SJordan Rupprecht    def test_lc_note(self):
2299451b44SJordan Rupprecht        self.build()
2399451b44SJordan Rupprecht        self.test_exe = self.getBuildArtifact("a.out")
2499451b44SJordan Rupprecht        self.create_corefile = self.getBuildArtifact("create-empty-corefile")
2599451b44SJordan Rupprecht        self.dsym_for_uuid = self.getBuildArtifact("dsym-for-uuid.sh")
2699451b44SJordan Rupprecht        self.corefile = self.getBuildArtifact("core")
2799451b44SJordan Rupprecht
2899451b44SJordan Rupprecht        ## We can hook in our dsym-for-uuid shell script to lldb with this env
2999451b44SJordan Rupprecht        ## var instead of requiring a defaults write.
302238dcc3SJonas Devlieghere        os.environ["LLDB_APPLE_DSYMFORUUID_EXECUTABLE"] = self.dsym_for_uuid
312238dcc3SJonas Devlieghere        self.addTearDownHook(
322238dcc3SJonas Devlieghere            lambda: os.environ.pop("LLDB_APPLE_DSYMFORUUID_EXECUTABLE", None)
332238dcc3SJonas Devlieghere        )
3499451b44SJordan Rupprecht
352238dcc3SJonas Devlieghere        dwarfdump_uuid_regex = re.compile("UUID: ([-0-9a-fA-F]+) \(([^\(]+)\) .*")
3699451b44SJordan Rupprecht        dwarfdump_cmd_output = subprocess.check_output(
372238dcc3SJonas Devlieghere            ('/usr/bin/dwarfdump --uuid "%s"' % self.test_exe), shell=True
382238dcc3SJonas Devlieghere        ).decode("utf-8")
3999451b44SJordan Rupprecht        aout_uuid = None
4099451b44SJordan Rupprecht        for line in dwarfdump_cmd_output.splitlines():
4199451b44SJordan Rupprecht            match = dwarfdump_uuid_regex.search(line)
4299451b44SJordan Rupprecht            if match:
4399451b44SJordan Rupprecht                aout_uuid = match.group(1)
4499451b44SJordan Rupprecht        self.assertNotEqual(aout_uuid, None, "Could not get uuid of built a.out")
4599451b44SJordan Rupprecht
4699451b44SJordan Rupprecht        ###  Create our dsym-for-uuid shell script which returns self.test_exe
4799451b44SJordan Rupprecht        ###  and its dSYM when given self.test_exe's UUID.
4899451b44SJordan Rupprecht        shell_cmds = [
492238dcc3SJonas Devlieghere            "#! /bin/sh",
502238dcc3SJonas Devlieghere            "ret=0",
5199451b44SJordan Rupprecht            'echo "<?xml version=\\"1.0\\" encoding=\\"UTF-8\\"?>"',
5299451b44SJordan Rupprecht            'echo "<!DOCTYPE plist PUBLIC \\"-//Apple//DTD PLIST 1.0//EN\\" \\"http://www.apple.com/DTDs/PropertyList-1.0.dtd\\">"',
5399451b44SJordan Rupprecht            'echo "<plist version=\\"1.0\\">"',
542238dcc3SJonas Devlieghere            "",
552238dcc3SJonas Devlieghere            "# the last argument is probably the uuid",
562238dcc3SJonas Devlieghere            "while [ $# -gt 1 ]",
572238dcc3SJonas Devlieghere            "do",
582238dcc3SJonas Devlieghere            "  shift",
592238dcc3SJonas Devlieghere            "done",
6099451b44SJordan Rupprecht            'echo "<dict><key>$1</key><dict>"',
612238dcc3SJonas Devlieghere            "",
6299451b44SJordan Rupprecht            'if [ "$1" = "%s" ]' % aout_uuid,
632238dcc3SJonas Devlieghere            "then",
6499451b44SJordan Rupprecht            '  echo "<key>DBGArchitecture</key><string>x86_64</string>"',
652238dcc3SJonas Devlieghere            '  echo "<key>DBGDSYMPath</key><string>%s.dSYM/Contents/Resources/DWARF/%s</string>"'
662238dcc3SJonas Devlieghere            % (self.test_exe, os.path.basename(self.test_exe)),
672238dcc3SJonas Devlieghere            '  echo "<key>DBGSymbolRichExecutable</key><string>%s</string>"'
682238dcc3SJonas Devlieghere            % self.test_exe,
692238dcc3SJonas Devlieghere            "else",
7099451b44SJordan Rupprecht            '  echo "<key>DBGError</key><string>not found</string>"',
712238dcc3SJonas Devlieghere            "  ret=1",
722238dcc3SJonas Devlieghere            "fi",
7399451b44SJordan Rupprecht            'echo "</dict></dict></plist>"',
742238dcc3SJonas Devlieghere            "exit $ret",
7599451b44SJordan Rupprecht        ]
7699451b44SJordan Rupprecht
7799451b44SJordan Rupprecht        with open(self.dsym_for_uuid, "w") as writer:
7899451b44SJordan Rupprecht            for l in shell_cmds:
792238dcc3SJonas Devlieghere                writer.write(l + "\n")
8099451b44SJordan Rupprecht
8199451b44SJordan Rupprecht        os.chmod(self.dsym_for_uuid, 0o755)
8299451b44SJordan Rupprecht
8399451b44SJordan Rupprecht        ### Create our corefile
842238dcc3SJonas Devlieghere        retcode = call(
852238dcc3SJonas Devlieghere            self.create_corefile + " " + self.corefile + " " + self.test_exe, shell=True
862238dcc3SJonas Devlieghere        )
8799451b44SJordan Rupprecht
8899451b44SJordan Rupprecht        ### Now run lldb on the corefile
8999451b44SJordan Rupprecht        ### which will give us a UUID
9099451b44SJordan Rupprecht        ### which we call dsym-for-uuid.sh with
9199451b44SJordan Rupprecht        ### which gives us a binary and dSYM
9299451b44SJordan Rupprecht        ### which lldb should load!
9399451b44SJordan Rupprecht
942238dcc3SJonas Devlieghere        self.target = self.dbg.CreateTarget("")
9599451b44SJordan Rupprecht        err = lldb.SBError()
9699451b44SJordan Rupprecht        self.process = self.target.LoadCore(self.corefile)
97*1eeeab82SJordan Rupprecht        self.assertTrue(self.process.IsValid())
9899451b44SJordan Rupprecht        if self.TraceOn():
9999451b44SJordan Rupprecht            self.runCmd("image list")
10099451b44SJordan Rupprecht        self.assertEqual(self.target.GetNumModules(), 1)
10199451b44SJordan Rupprecht        fspec = self.target.GetModuleAtIndex(0).GetFileSpec()
10299451b44SJordan Rupprecht        filepath = fspec.GetDirectory() + "/" + fspec.GetFilename()
10399451b44SJordan Rupprecht        self.assertEqual(filepath, self.test_exe)
104