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 @expectedFailureAll( 1199451b44SJordan Rupprecht oslist=["windows"], 12*2238dcc3SJonas Devlieghere bugnumber="llvm.org/pr21765, getpid() does not exist on Windows", 13*2238dcc3SJonas Devlieghere ) 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() 29*2238dcc3SJonas Devlieghere process = target.Launch( 30*2238dcc3SJonas Devlieghere listener, 3199451b44SJordan Rupprecht None, # argv 3299451b44SJordan Rupprecht None, # envp 3399451b44SJordan Rupprecht None, # stdin_path 3499451b44SJordan Rupprecht None, # stdout_path 3599451b44SJordan Rupprecht None, # stderr_path 3699451b44SJordan Rupprecht None, # working directory 372ddba09eSJonas Devlieghere flags, # launch flags 3899451b44SJordan Rupprecht False, # Stop at entry 39*2238dcc3SJonas Devlieghere error, 40*2238dcc3SJonas Devlieghere ) # error 4199451b44SJordan Rupprecht 4299451b44SJordan Rupprecht self.assertTrue(process and process.IsValid(), PROCESS_IS_VALID) 4399451b44SJordan Rupprecht 4499451b44SJordan Rupprecht event = lldb.SBEvent() 4599451b44SJordan Rupprecht 4699451b44SJordan Rupprecht # Give the child enough time to reach the syscall, 4799451b44SJordan Rupprecht # while clearing out all the pending events. 4899451b44SJordan Rupprecht # The last WaitForEvent call will time out after 2 seconds. 4999451b44SJordan Rupprecht while listener.WaitForEvent(2, event): 5099451b44SJordan Rupprecht pass 5199451b44SJordan Rupprecht 5299451b44SJordan Rupprecht # now the process should be running (blocked in the syscall) 53*2238dcc3SJonas Devlieghere self.assertEqual(process.GetState(), lldb.eStateRunning, "Process is running") 5499451b44SJordan Rupprecht 5599451b44SJordan Rupprecht # send the process a signal 5699451b44SJordan Rupprecht process.SendAsyncInterrupt() 5799451b44SJordan Rupprecht while listener.WaitForEvent(2, event): 5899451b44SJordan Rupprecht pass 5999451b44SJordan Rupprecht 6099451b44SJordan Rupprecht # as a result the process should stop 6199451b44SJordan Rupprecht # in all likelihood we have stopped in the middle of the sleep() 6299451b44SJordan Rupprecht # syscall 63*2238dcc3SJonas Devlieghere self.assertEqual(process.GetState(), lldb.eStateStopped, PROCESS_STOPPED) 6499451b44SJordan Rupprecht thread = process.GetSelectedThread() 6599451b44SJordan Rupprecht 6699451b44SJordan Rupprecht # try evaluating a couple of expressions in this state 6742b9a683SRaphael Isemann self.expect_expr("release_flag = 1", result_value="1") 6842b9a683SRaphael Isemann self.expect_expr("(int)getpid()", result_value=str(process.GetProcessID())) 6999451b44SJordan Rupprecht 7099451b44SJordan Rupprecht # and run the process to completion 7199451b44SJordan Rupprecht process.Continue() 7299451b44SJordan Rupprecht 7399451b44SJordan Rupprecht # process all events 7499451b44SJordan Rupprecht while listener.WaitForEvent(10, event): 7599451b44SJordan Rupprecht new_state = lldb.SBProcess.GetStateFromEvent(event) 7699451b44SJordan Rupprecht if new_state == lldb.eStateExited: 7799451b44SJordan Rupprecht break 7899451b44SJordan Rupprecht 791b8c7352SJonas Devlieghere self.assertState(process.GetState(), lldb.eStateExited) 8099451b44SJordan Rupprecht self.assertEqual(process.GetExitStatus(), 0) 81