My main work directory is on a separate partition, but I usually access it through a symlink in my home directory. When running the tests, either Clang or make resolves the symlink, and the real path of the test directory ends up in the debug information. This confuses this test as LLDB is trying to remap the real path, but the remapping description uses the path with the symlink in it. Calling realpath on the source path when constructing the remapping description fixes it.
62 lines
2.3 KiB
Python
62 lines
2.3 KiB
Python
import lldb
|
|
from lldbsuite.test.decorators import *
|
|
import lldbsuite.test.lldbtest as lldbtest
|
|
import lldbsuite.test.lldbutil as lldbutil
|
|
import os
|
|
import unittest2
|
|
|
|
|
|
class TestDSYMSourcePathRemapping(lldbtest.TestBase):
|
|
|
|
mydir = lldbtest.TestBase.compute_mydir(__file__)
|
|
|
|
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('<?xml version="1.0" encoding="UTF-8"?>\n')
|
|
f.write('<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">\n')
|
|
f.write('<plist version="1.0">\n')
|
|
f.write('<dict>\n')
|
|
f.write(' <key>DBGSourcePathRemapping</key>\n')
|
|
f.write(' <dict>\n')
|
|
f.write(' <key>' + os.path.realpath(botdir) + '</key>\n')
|
|
f.write(' <string>' + userdir + '</string>\n')
|
|
f.write(' </dict>\n')
|
|
f.write('</dict>\n')
|
|
f.write('</plist>\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"])
|