199451b44SJordan Rupprecht"""Test that we are able to evaluate expressions when the inferior is blocked in a syscall""" 299451b44SJordan Rupprecht 399451b44SJordan Rupprechtimport lldb 499451b44SJordan Rupprechtfrom lldbsuite.test.decorators import * 599451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import * 699451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil 799451b44SJordan Rupprecht 899451b44SJordan Rupprecht 999451b44SJordan Rupprechtclass ExprSyscallTestCase(TestBase): 1099451b44SJordan Rupprecht 1199451b44SJordan Rupprecht @expectedFailureAll( 1299451b44SJordan Rupprecht oslist=["windows"], 1399451b44SJordan Rupprecht bugnumber="llvm.org/pr21765, getpid() does not exist on Windows") 1499451b44SJordan Rupprecht @expectedFailureNetBSD 1599451b44SJordan Rupprecht def test_setpgid(self): 1699451b44SJordan Rupprecht self.build() 1799451b44SJordan Rupprecht self.expr_syscall() 1899451b44SJordan Rupprecht 1999451b44SJordan Rupprecht def expr_syscall(self): 2099451b44SJordan Rupprecht # Create a target by the debugger. 2154c26872SRaphael Isemann target = self.createTestTarget() 2299451b44SJordan Rupprecht 2399451b44SJordan Rupprecht listener = lldb.SBListener("my listener") 2499451b44SJordan Rupprecht 2599451b44SJordan Rupprecht # launch the inferior and don't wait for it to stop 2699451b44SJordan Rupprecht self.dbg.SetAsync(True) 2799451b44SJordan Rupprecht error = lldb.SBError() 282ddba09eSJonas Devlieghere flags = target.GetLaunchInfo().GetLaunchFlags() 2999451b44SJordan Rupprecht process = target.Launch(listener, 3099451b44SJordan Rupprecht None, # argv 3199451b44SJordan Rupprecht None, # envp 3299451b44SJordan Rupprecht None, # stdin_path 3399451b44SJordan Rupprecht None, # stdout_path 3499451b44SJordan Rupprecht None, # stderr_path 3599451b44SJordan Rupprecht None, # working directory 362ddba09eSJonas Devlieghere flags, # launch flags 3799451b44SJordan Rupprecht False, # Stop at entry 3899451b44SJordan Rupprecht error) # error 3999451b44SJordan Rupprecht 4099451b44SJordan Rupprecht self.assertTrue(process and process.IsValid(), PROCESS_IS_VALID) 4199451b44SJordan Rupprecht 4299451b44SJordan Rupprecht event = lldb.SBEvent() 4399451b44SJordan Rupprecht 4499451b44SJordan Rupprecht # Give the child enough time to reach the syscall, 4599451b44SJordan Rupprecht # while clearing out all the pending events. 4699451b44SJordan Rupprecht # The last WaitForEvent call will time out after 2 seconds. 4799451b44SJordan Rupprecht while listener.WaitForEvent(2, event): 4899451b44SJordan Rupprecht pass 4999451b44SJordan Rupprecht 5099451b44SJordan Rupprecht # now the process should be running (blocked in the syscall) 5199451b44SJordan Rupprecht self.assertEqual( 5299451b44SJordan Rupprecht process.GetState(), 5399451b44SJordan Rupprecht lldb.eStateRunning, 5499451b44SJordan Rupprecht "Process is running") 5599451b44SJordan Rupprecht 5699451b44SJordan Rupprecht # send the process a signal 5799451b44SJordan Rupprecht process.SendAsyncInterrupt() 5899451b44SJordan Rupprecht while listener.WaitForEvent(2, event): 5999451b44SJordan Rupprecht pass 6099451b44SJordan Rupprecht 6199451b44SJordan Rupprecht # as a result the process should stop 6299451b44SJordan Rupprecht # in all likelihood we have stopped in the middle of the sleep() 6399451b44SJordan Rupprecht # syscall 6499451b44SJordan Rupprecht self.assertEqual( 6599451b44SJordan Rupprecht process.GetState(), 6699451b44SJordan Rupprecht lldb.eStateStopped, 6799451b44SJordan Rupprecht PROCESS_STOPPED) 6899451b44SJordan Rupprecht thread = process.GetSelectedThread() 6999451b44SJordan Rupprecht 7099451b44SJordan Rupprecht # try evaluating a couple of expressions in this state 7142b9a683SRaphael Isemann self.expect_expr("release_flag = 1", result_value="1") 7242b9a683SRaphael Isemann self.expect_expr("(int)getpid()", result_value=str(process.GetProcessID())) 7399451b44SJordan Rupprecht 7499451b44SJordan Rupprecht # and run the process to completion 7599451b44SJordan Rupprecht process.Continue() 7699451b44SJordan Rupprecht 7799451b44SJordan Rupprecht # process all events 7899451b44SJordan Rupprecht while listener.WaitForEvent(10, event): 7999451b44SJordan Rupprecht new_state = lldb.SBProcess.GetStateFromEvent(event) 8099451b44SJordan Rupprecht if new_state == lldb.eStateExited: 8199451b44SJordan Rupprecht break 8299451b44SJordan Rupprecht 83*1b8c7352SJonas Devlieghere self.assertState(process.GetState(), lldb.eStateExited) 8499451b44SJordan Rupprecht self.assertEqual(process.GetExitStatus(), 0) 85