Enable test log collection from remote debug servers (take 2)

Summary:
This is a slightly reworked version of D16322, which I had reverted because it did not do what it
advertised. Differences from the previous version are:
- moved the code for cleaning up the remote working dir to a later point as it was removing the
  log file before we could get to it.
- specialised log downloading code for gdb-remote tests is not needed, as this will cover that
  use case as well.

Reviewers: tfiala

Subscribers: lldb-commits

Differential Revision: http://reviews.llvm.org/D21898

llvm-svn: 274491
This commit is contained in:
Pavel Labath 2016-07-04 09:59:45 +00:00
parent abb79683bb
commit 7cf00d191a
2 changed files with 47 additions and 42 deletions

View File

@ -583,7 +583,7 @@ class Base(unittest2.TestCase):
else:
categories = "default"
if channel == "gdb-remote":
if channel == "gdb-remote" and lldb.remote_platform is None:
# communicate gdb-remote categories to debugserver
os.environ["LLDB_DEBUGSERVER_LOG_FLAGS"] = categories
@ -592,15 +592,17 @@ class Base(unittest2.TestCase):
raise Exception('log enable failed (check LLDB_LOG_OPTION env variable)')
# Communicate log path name to debugserver & lldb-server
server_log_path = "{}-server.log".format(log_basename)
open(server_log_path, 'w').close()
os.environ["LLDB_DEBUGSERVER_LOG_FILE"] = server_log_path
# For remote debugging, these variables need to be set when starting the platform
# instance.
if lldb.remote_platform is None:
server_log_path = "{}-server.log".format(log_basename)
open(server_log_path, 'w').close()
os.environ["LLDB_DEBUGSERVER_LOG_FILE"] = server_log_path
# Communicate channels to lldb-server
os.environ["LLDB_SERVER_LOG_CHANNELS"] = ":".join(lldbtest_config.channels)
# Communicate channels to lldb-server
os.environ["LLDB_SERVER_LOG_CHANNELS"] = ":".join(lldbtest_config.channels)
if len(lldbtest_config.channels) == 0:
return
self.addTearDownHook(self.disableLogChannelsForCurrentTest)
def disableLogChannelsForCurrentTest(self):
# close all log files that we opened
@ -611,6 +613,42 @@ class Base(unittest2.TestCase):
if not self.res.Succeeded():
raise Exception('log disable failed (check LLDB_LOG_OPTION env variable)')
# Retrieve the server log (if any) from the remote system. It is assumed the server log
# is writing to the "server.log" file in the current test directory. This can be
# achieved by setting LLDB_DEBUGSERVER_LOG_FILE="server.log" when starting remote
# platform. If the remote logging is not enabled, then just let the Get() command silently
# fail.
if lldb.remote_platform:
lldb.remote_platform.Get(lldb.SBFileSpec("server.log"),
lldb.SBFileSpec(self.getLogBasenameForCurrentTest()+"-server.log"))
def setPlatformWorkingDir(self):
if not lldb.remote_platform or not configuration.lldb_platform_working_dir:
return
remote_test_dir = lldbutil.join_remote_paths(
configuration.lldb_platform_working_dir,
self.getArchitecture(),
str(self.test_number),
self.mydir)
error = lldb.remote_platform.MakeDirectory(remote_test_dir, 448) # 448 = 0o700
if error.Success():
lldb.remote_platform.SetWorkingDirectory(remote_test_dir)
# This function removes all files from the current working directory while leaving
# the directories in place. The cleaup is required to reduce the disk space required
# by the test suit while leaving the directories untached is neccessary because
# sub-directories might belong to an other test
def clean_working_directory():
# TODO: Make it working on Windows when we need it for remote debugging support
# TODO: Replace the heuristic to remove the files with a logic what collects the
# list of files we have to remove during test runs.
shell_cmd = lldb.SBPlatformShellCommand("rm %s/*" % remote_test_dir)
lldb.remote_platform.Run(shell_cmd)
self.addTearDownHook(clean_working_directory)
else:
print("error: making remote directory '%s': %s" % (remote_test_dir, error))
def setUp(self):
"""Fixture for unittest test case setup.
@ -716,6 +754,7 @@ class Base(unittest2.TestCase):
# And the result object.
self.res = lldb.SBCommandReturnObject()
self.setPlatformWorkingDir()
self.enableLogChannelsForCurrentTest()
#Initialize debug_info
@ -884,8 +923,6 @@ class Base(unittest2.TestCase):
for dict in reversed(self.dicts):
self.cleanup(dictionary=dict)
self.disableLogChannelsForCurrentTest()
# =========================================================
# Various callbacks to allow introspection of test progress
# =========================================================
@ -1614,30 +1651,6 @@ class TestBase(Base):
# And the result object.
self.res = lldb.SBCommandReturnObject()
if lldb.remote_platform and configuration.lldb_platform_working_dir:
remote_test_dir = lldbutil.join_remote_paths(
configuration.lldb_platform_working_dir,
self.getArchitecture(),
str(self.test_number),
self.mydir)
error = lldb.remote_platform.MakeDirectory(remote_test_dir, 448) # 448 = 0o700
if error.Success():
lldb.remote_platform.SetWorkingDirectory(remote_test_dir)
# This function removes all files from the current working directory while leaving
# the directories in place. The cleaup is required to reduce the disk space required
# by the test suit while leaving the directories untached is neccessary because
# sub-directories might belong to an other test
def clean_working_directory():
# TODO: Make it working on Windows when we need it for remote debugging support
# TODO: Replace the heuristic to remove the files with a logic what collects the
# list of files we have to remove during test runs.
shell_cmd = lldb.SBPlatformShellCommand("rm %s/*" % remote_test_dir)
lldb.remote_platform.Run(shell_cmd)
self.addTearDownHook(clean_working_directory)
else:
print("error: making remote directory '%s': %s" % (remote_test_dir, error))
def registerSharedLibrariesWithTarget(self, target, shlibs):
'''If we are remotely running the test suite, register the shared libraries with the target so they get uploaded, otherwise do nothing

View File

@ -78,7 +78,6 @@ class GdbRemoteTestCaseBase(TestBase):
TestBase.setUp(self)
self.setUpBaseLogging()
self._remote_server_log_file = None
self.debug_monitor_extra_args = []
self._pump_queues = socket_packet_pump.PumpQueues()
@ -114,12 +113,6 @@ class GdbRemoteTestCaseBase(TestBase):
def tearDown(self):
self._pump_queues.verify_queues_empty()
if self._remote_server_log_file is not None:
lldb.remote_platform.Get(lldb.SBFileSpec(self._remote_server_log_file),
lldb.SBFileSpec(self.getLocalServerLogFile()))
lldb.remote_platform.Run(lldb.SBPlatformShellCommand("rm " + self._remote_server_log_file))
self._remote_server_log_file = None
self.logger.removeHandler(self._verbose_log_handler)
self._verbose_log_handler = None
TestBase.tearDown(self)
@ -133,7 +126,6 @@ class GdbRemoteTestCaseBase(TestBase):
if lldb.remote_platform:
log_file = lldbutil.join_remote_paths(lldb.remote_platform.GetWorkingDirectory(), "server.log")
self._remote_server_log_file = log_file
else:
log_file = self.getLocalServerLogFile()