""" Test process attach/resume. """ import lldb from lldbsuite.test.decorators import * from lldbsuite.test.lldbtest import * from lldbsuite.test import lldbutil exe_name = "AttachResume" # Must match Makefile class AttachResumeTestCase(TestBase): NO_DEBUG_INFO_TESTCASE = True @skipIfRemote @expectedFailureNetBSD @skipIfWindows # llvm.org/pr24778, llvm.org/pr21753 def test_attach_continue_interrupt_detach(self): """Test attach/continue/interrupt/detach""" self.build() self.process_attach_continue_interrupt_detach() def process_attach_continue_interrupt_detach(self): """Test attach/continue/interrupt/detach""" exe = self.getBuildArtifact(exe_name) popen = self.spawnSubprocess(exe) self.runCmd("process attach -p " + str(popen.pid)) self.setAsync(True) listener = self.dbg.GetListener() process = self.dbg.GetSelectedTarget().GetProcess() self.runCmd("c") lldbutil.expect_state_changes(self, listener, process, [lldb.eStateRunning]) self.runCmd("process interrupt") lldbutil.expect_state_changes(self, listener, process, [lldb.eStateStopped]) # be sure to continue/interrupt/continue (r204504) self.runCmd("c") lldbutil.expect_state_changes(self, listener, process, [lldb.eStateRunning]) self.runCmd("process interrupt") lldbutil.expect_state_changes(self, listener, process, [lldb.eStateStopped]) # Second interrupt should have no effect. self.expect( "process interrupt", patterns=["Process is not running"], error=True ) # check that this breakpoint is auto-cleared on detach (r204752) self.runCmd( "br set -f main.cpp -l %u" % (line_number("main.cpp", "// Set breakpoint here")) ) self.runCmd("c") lldbutil.expect_state_changes( self, listener, process, [lldb.eStateRunning, lldb.eStateStopped] ) self.expect("br list", "Breakpoint not hit", substrs=["hit count = 1"]) # Make sure the breakpoint is not hit again. self.expect("expr debugger_flag = false", substrs=[" = false"]) self.runCmd("c") lldbutil.expect_state_changes(self, listener, process, [lldb.eStateRunning]) # make sure to detach while in running state (r204759) self.runCmd("detach") lldbutil.expect_state_changes(self, listener, process, [lldb.eStateDetached])