Make it possible to capture reproducers from the API test suite. Given the symmetry between capture and replay, this patch also adds the necessary code for replay. For now this is a NO-OP until the corresponding reproducer instrumentation changes land. For more info please refer to the RFC on lldb-dev: http://lists.llvm.org/pipermail/lldb-dev/2020-April/016100.html Differential revision: https://reviews.llvm.org/D77588
75 lines
2.4 KiB
Python
75 lines
2.4 KiB
Python
"""
|
|
Test reproducer attach.
|
|
"""
|
|
|
|
import lldb
|
|
import tempfile
|
|
from lldbsuite.test import lldbtest_config
|
|
from lldbsuite.test.decorators import *
|
|
from lldbsuite.test.lldbtest import *
|
|
from lldbsuite.test import lldbutil
|
|
|
|
|
|
class ReproducerAttachTestCase(TestBase):
|
|
|
|
mydir = TestBase.compute_mydir(__file__)
|
|
NO_DEBUG_INFO_TESTCASE = True
|
|
|
|
@skipIfFreeBSD
|
|
@skipIfNetBSD
|
|
@skipIfWindows
|
|
@skipIfRemote
|
|
@skipIfiOSSimulator
|
|
@skipIfReproducer
|
|
def test_reproducer_attach(self):
|
|
"""Test thread creation after process attach."""
|
|
exe = '%s_%d' % (self.testMethodName, os.getpid())
|
|
|
|
token = self.getBuildArtifact(exe + '.token')
|
|
if os.path.exists(token):
|
|
os.remove(token)
|
|
|
|
reproducer = self.getBuildArtifact(exe + '.reproducer')
|
|
if os.path.exists(reproducer):
|
|
try:
|
|
shutil.rmtree(reproducer)
|
|
except OSError:
|
|
pass
|
|
|
|
self.build(dictionary={'EXE': exe})
|
|
self.addTearDownHook(self.cleanupSubprocesses)
|
|
|
|
inferior = self.spawnSubprocess(self.getBuildArtifact(exe), [token])
|
|
pid = inferior.pid
|
|
|
|
lldbutil.wait_for_file_on_target(self, token)
|
|
|
|
# Use Popen because pexpect is overkill and spawnSubprocess is
|
|
# asynchronous.
|
|
capture = subprocess.Popen([
|
|
lldbtest_config.lldbExec, '-b', '--capture', '--capture-path',
|
|
reproducer, '-o', 'proc att -n {}'.format(exe), '-o',
|
|
'reproducer generate'
|
|
],
|
|
stdin=subprocess.PIPE,
|
|
stdout=subprocess.PIPE,
|
|
stderr=subprocess.PIPE)
|
|
outs, _ = capture.communicate()
|
|
outs = outs.decode('utf-8')
|
|
self.assertIn('Process {} stopped'.format(pid), outs)
|
|
self.assertIn('Reproducer written', outs)
|
|
|
|
# Check that replay works.
|
|
replay = subprocess.Popen(
|
|
[lldbtest_config.lldbExec, '-replay', reproducer],
|
|
stdin=subprocess.PIPE,
|
|
stdout=subprocess.PIPE,
|
|
stderr=subprocess.PIPE)
|
|
outs, _ = replay.communicate()
|
|
outs = outs.decode('utf-8')
|
|
self.assertIn('Process {} stopped'.format(pid), outs)
|
|
|
|
# We can dump the reproducer in the current context.
|
|
self.expect('reproducer dump -f {} -p process'.format(reproducer),
|
|
substrs=['pid = {}'.format(pid), 'name = {}'.format(exe)])
|