199451b44SJordan Rupprechtimport lldb 299451b44SJordan Rupprechtfrom lldbsuite.test.decorators import * 399451b44SJordan Rupprechtimport lldbsuite.test.lldbtest as lldbtest 499451b44SJordan Rupprechtimport lldbsuite.test.lldbutil as lldbutil 599451b44SJordan Rupprechtimport os 699451b44SJordan Rupprechtimport unittest2 799451b44SJordan Rupprecht 899451b44SJordan Rupprecht 999451b44SJordan Rupprechtclass TestDSYMSourcePathRemapping(lldbtest.TestBase): 1099451b44SJordan Rupprecht 1199451b44SJordan Rupprecht def build(self): 1299451b44SJordan Rupprecht botdir = self.getBuildArtifact('buildbot') 1399451b44SJordan Rupprecht userdir = self.getBuildArtifact('user') 1499451b44SJordan Rupprecht inputs = self.getSourcePath('Inputs') 1599451b44SJordan Rupprecht lldbutil.mkdir_p(botdir) 1699451b44SJordan Rupprecht lldbutil.mkdir_p(userdir) 1799451b44SJordan Rupprecht import shutil 1899451b44SJordan Rupprecht for f in ['main.c', 'relative.c']: 1999451b44SJordan Rupprecht shutil.copyfile(os.path.join(inputs, f), os.path.join(botdir, f)) 2099451b44SJordan Rupprecht shutil.copyfile(os.path.join(inputs, f), os.path.join(userdir, f)) 2199451b44SJordan Rupprecht 2299451b44SJordan Rupprecht super(TestDSYMSourcePathRemapping, self).build() 2399451b44SJordan Rupprecht 2499451b44SJordan Rupprecht # Remove the build sources. 2599451b44SJordan Rupprecht self.assertTrue(os.path.isdir(botdir)) 2699451b44SJordan Rupprecht shutil.rmtree(botdir) 2799451b44SJordan Rupprecht 2899451b44SJordan Rupprecht # Create a plist. 2999451b44SJordan Rupprecht import subprocess 3099451b44SJordan Rupprecht dsym = self.getBuildArtifact('a.out.dSYM') 3199451b44SJordan Rupprecht uuid = subprocess.check_output(["/usr/bin/dwarfdump", "--uuid", dsym] 3299451b44SJordan Rupprecht ).decode("utf-8").split(" ")[1] 3399451b44SJordan Rupprecht import re 3499451b44SJordan Rupprecht self.assertTrue(re.match(r'[0-9a-fA-F-]+', uuid)) 3599451b44SJordan Rupprecht plist = os.path.join(dsym, 'Contents', 'Resources', uuid + '.plist') 3699451b44SJordan Rupprecht with open(plist, 'w') as f: 3799451b44SJordan Rupprecht f.write('<?xml version="1.0" encoding="UTF-8"?>\n') 3899451b44SJordan Rupprecht f.write('<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">\n') 3999451b44SJordan Rupprecht f.write('<plist version="1.0">\n') 4099451b44SJordan Rupprecht f.write('<dict>\n') 4199451b44SJordan Rupprecht f.write(' <key>DBGSourcePathRemapping</key>\n') 4299451b44SJordan Rupprecht f.write(' <dict>\n') 43*06ea05a3SFred Riss f.write(' <key>' + os.path.realpath(botdir) + '</key>\n') 4499451b44SJordan Rupprecht f.write(' <string>' + userdir + '</string>\n') 4599451b44SJordan Rupprecht f.write(' </dict>\n') 4699451b44SJordan Rupprecht f.write('</dict>\n') 4799451b44SJordan Rupprecht f.write('</plist>\n') 4899451b44SJordan Rupprecht 4999451b44SJordan Rupprecht 5099451b44SJordan Rupprecht @skipIf(debug_info=no_match("dsym")) 5199451b44SJordan Rupprecht def test(self): 5299451b44SJordan Rupprecht self.build() 5399451b44SJordan Rupprecht 5499451b44SJordan Rupprecht target, process, _, _ = lldbutil.run_to_name_breakpoint( 5599451b44SJordan Rupprecht self, 'main') 5699451b44SJordan Rupprecht self.expect("source list -n main", substrs=["Hello Absolute"]) 5799451b44SJordan Rupprecht bkpt = target.BreakpointCreateByName('relative') 5899451b44SJordan Rupprecht lldbutil.continue_to_breakpoint(process, bkpt) 5999451b44SJordan Rupprecht self.expect("source list -n relative", substrs=["Hello Relative"]) 60