import lldb from lldbsuite.test.decorators import * import lldbsuite.test.lldbtest as lldbtest import lldbsuite.test.lldbutil as lldbutil import os class TestDSYMSourcePathRemapping(lldbtest.TestBase): def build(self): botdir = self.getBuildArtifact("buildbot") userdir = self.getBuildArtifact("user") inputs = self.getSourcePath("Inputs") lldbutil.mkdir_p(botdir) lldbutil.mkdir_p(userdir) import shutil for f in ["main.c", "relative.c"]: shutil.copyfile(os.path.join(inputs, f), os.path.join(botdir, f)) shutil.copyfile(os.path.join(inputs, f), os.path.join(userdir, f)) super(TestDSYMSourcePathRemapping, self).build() # Remove the build sources. self.assertTrue(os.path.isdir(botdir)) shutil.rmtree(botdir) # Create a plist. import subprocess dsym = self.getBuildArtifact("a.out.dSYM") uuid = ( subprocess.check_output(["/usr/bin/dwarfdump", "--uuid", dsym]) .decode("utf-8") .split(" ")[1] ) import re self.assertTrue(re.match(r"[0-9a-fA-F-]+", uuid)) plist = os.path.join(dsym, "Contents", "Resources", uuid + ".plist") with open(plist, "w") as f: f.write('\n') f.write( '\n' ) f.write('\n') f.write("\n") f.write(" DBGSourcePathRemapping\n") f.write(" \n") f.write(" " + os.path.realpath(botdir) + "\n") f.write(" " + userdir + "\n") f.write(" \n") f.write("\n") f.write("\n") @skipIf(debug_info=no_match("dsym")) def test(self): self.build() target, process, _, _ = lldbutil.run_to_name_breakpoint(self, "main") self.expect("source list -n main", substrs=["Hello Absolute"]) bkpt = target.BreakpointCreateByName("relative") lldbutil.continue_to_breakpoint(process, bkpt) self.expect("source list -n relative", substrs=["Hello Relative"])