David Spickett a17c598145 [lldb][test] Enable TestExpressionInSyscall.py on Windows
Relates to https://github.com/llvm/llvm-project/issues/22139

Just had to use the right win32 call instead of getpid. The original
problem was something with expressions in general which was
fixed at some point.

Also make the test one method, there's no need to split it up.
2025-07-03 10:00:50 +00:00

80 lines
2.6 KiB
Python

"""Test that we are able to evaluate expressions when the inferior is blocked in a syscall"""
import lldb
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
from lldbsuite.test import lldbutil
class ExprSyscallTestCase(TestBase):
@expectedFailureNetBSD
def test_setpgid(self):
self.build()
# Create a target by the debugger.
target = self.createTestTarget()
listener = lldb.SBListener("my listener")
# launch the inferior and don't wait for it to stop
self.dbg.SetAsync(True)
error = lldb.SBError()
flags = target.GetLaunchInfo().GetLaunchFlags()
process = target.Launch(
listener,
None, # argv
None, # envp
None, # stdin_path
None, # stdout_path
None, # stderr_path
None, # working directory
flags, # launch flags
False, # Stop at entry
error,
) # error
self.assertTrue(process and process.IsValid(), PROCESS_IS_VALID)
event = lldb.SBEvent()
# Give the child enough time to reach the syscall,
# while clearing out all the pending events.
# The last WaitForEvent call will time out after 2 seconds.
while listener.WaitForEvent(2, event):
pass
# now the process should be running (blocked in the syscall)
self.assertEqual(process.GetState(), lldb.eStateRunning, "Process is running")
# send the process a signal
process.SendAsyncInterrupt()
while listener.WaitForEvent(2, event):
pass
# as a result the process should stop
# in all likelihood we have stopped in the middle of the sleep()
# syscall
self.assertEqual(process.GetState(), lldb.eStateStopped, PROCESS_STOPPED)
thread = process.GetSelectedThread()
# try evaluating a couple of expressions in this state
self.expect_expr("release_flag = 1", result_value="1")
func = (
"GetCurrentProcessId"
if lldbplatformutil.getPlatform() == "windows"
else "getpid"
)
self.expect_expr(f"(int){func}()", result_value=str(process.GetProcessID()))
# and run the process to completion
process.Continue()
# process all events
while listener.WaitForEvent(10, event):
new_state = lldb.SBProcess.GetStateFromEvent(event)
if new_state == lldb.eStateExited:
break
self.assertState(process.GetState(), lldb.eStateExited)
self.assertEqual(process.GetExitStatus(), 0)