xref: /llvm-project/lldb/test/API/commands/expression/expr-in-syscall/TestExpressionInSyscall.py (revision 2238dcc39358353cac21df75c3c3286ab20b8f53)
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