""" Test using SendAsyncInterrupt to interrupt an "attach wait" """ import lldb import sys import time import threading from lldbsuite.test.decorators import * from lldbsuite.test.lldbtest import * import lldbsuite.test.lldbutil class AttachCancelTestCase(TestBase): NO_DEBUG_INFO_TESTCASE = True @skipIf( remote=True, hostoslist=["windows"], bugnumber="https://github.com/llvm/llvm-project/issues/115618", ) def test_scripted_implementation(self): """Test that cancelling a stuck "attach waitfor" works.""" # First make an empty target for the attach: target = self.dbg.CreateTarget(None) # We need to cancel this, so we need to do the attach # on a separate thread: class AttachThread(threading.Thread): def __init__(self, target, error): # Make this a daemon thread so if we don't manage to interrupt, # Python will keep this thread from hanging the test. threading.Thread.__init__(self, daemon=True) self.target = target self.error = error def run(self): self.target.AttachToProcessWithName( lldb.SBListener(), "LLDB-No-Such-Process", True, self.error ) error = lldb.SBError() thread = AttachThread(target, error) thread.start() # Now wait till the attach on the child thread has made a process # for the attach attempt: while not target.process.IsValid(): time.sleep(1) # I don't have a positive signal for "we started the attach attempt" # so the best I can do is sleep a bit more here to give that a chance # to start: time.sleep(1) # Now send the attach interrupt: target.process.SendAsyncInterrupt() # We don't want to stall if we can't interrupt, so join with a timeout: thread.join(60) if thread.is_alive(): self.fail("The attach thread is alive after timeout interval") # Now check the error, should say the attach was interrupted: self.assertTrue(error.Fail(), "We succeeded in not attaching")