64 lines · python
1"""2Test using SendAsyncInterrupt to interrupt an "attach wait"3"""4 5import lldb6import sys7import time8import threading9from lldbsuite.test.decorators import *10from lldbsuite.test.lldbtest import *11import lldbsuite.test.lldbutil12 13 14class AttachCancelTestCase(TestBase):15 NO_DEBUG_INFO_TESTCASE = True16 17 @skipIf(18 remote=True,19 hostoslist=["windows"],20 bugnumber="https://github.com/llvm/llvm-project/issues/115618",21 )22 def test_scripted_implementation(self):23 """Test that cancelling a stuck "attach waitfor" works."""24 # First make an empty target for the attach:25 target = self.dbg.CreateTarget(None)26 27 # We need to cancel this, so we need to do the attach28 # on a separate thread:29 class AttachThread(threading.Thread):30 def __init__(self, target, error):31 # Make this a daemon thread so if we don't manage to interrupt,32 # Python will keep this thread from hanging the test.33 threading.Thread.__init__(self, daemon=True)34 self.target = target35 self.error = error36 37 def run(self):38 self.target.AttachToProcessWithName(39 lldb.SBListener(), "LLDB-No-Such-Process", True, self.error40 )41 42 error = lldb.SBError()43 thread = AttachThread(target, error)44 thread.start()45 46 # Now wait till the attach on the child thread has made a process47 # for the attach attempt:48 while not target.process.IsValid():49 time.sleep(1)50 # I don't have a positive signal for "we started the attach attempt"51 # so the best I can do is sleep a bit more here to give that a chance52 # to start:53 time.sleep(1)54 55 # Now send the attach interrupt:56 target.process.SendAsyncInterrupt()57 # We don't want to stall if we can't interrupt, so join with a timeout:58 thread.join(60)59 if thread.is_alive():60 self.fail("The attach thread is alive after timeout interval")61 62 # Now check the error, should say the attach was interrupted:63 self.assertTrue(error.Fail(), "We succeeded in not attaching")64