c4d6461ddde78e098b6588baa578b76ad96b2947
[openbsd] /
1 """
2 This tests that we do not lose control of the inferior, while doing an instruction-level step
3 over a thread creation instruction.
4 """
5
6
7
8 import lldb
9 from lldbsuite.test.decorators import *
10 from lldbsuite.test.lldbtest import *
11 from lldbsuite.test import lldbutil
12
13
14 class CreateDuringInstructionStepTestCase(TestBase):
15
16     mydir = TestBase.compute_mydir(__file__)
17     NO_DEBUG_INFO_TESTCASE = True
18
19     @skipUnlessPlatform(['linux'])
20     @expectedFailureAndroid('llvm.org/pr24737', archs=['arm'])
21     @expectedFailureAll(
22         oslist=["linux"],
23         archs=["arm"],
24         bugnumber="llvm.org/pr24737")
25     def test_step_inst(self):
26         self.build(dictionary=self.getBuildFlags())
27         exe = self.getBuildArtifact("a.out")
28         target = self.dbg.CreateTarget(exe)
29         self.assertTrue(target and target.IsValid(), "Target is valid")
30
31         # This should create a breakpoint in the stepping thread.
32         breakpoint = target.BreakpointCreateByName("main")
33         self.assertTrue(
34             breakpoint and breakpoint.IsValid(),
35             "Breakpoint is valid")
36
37         # Run the program.
38         process = target.LaunchSimple(
39             None, None, self.get_process_working_directory())
40         self.assertTrue(process and process.IsValid(), PROCESS_IS_VALID)
41
42         # The stop reason of the thread should be breakpoint.
43         self.assertEqual(
44             process.GetState(),
45             lldb.eStateStopped,
46             PROCESS_STOPPED)
47
48         threads = lldbutil.get_threads_stopped_at_breakpoint(
49             process, breakpoint)
50         self.assertEqual(len(threads), 1, STOPPED_DUE_TO_BREAKPOINT)
51
52         thread = threads[0]
53         self.assertTrue(thread and thread.IsValid(), "Thread is valid")
54
55         # Make sure we see only one threads
56         self.assertEqual(
57             process.GetNumThreads(),
58             1,
59             'Number of expected threads and actual threads do not match.')
60
61         # Keep stepping until we see the thread creation
62         while process.GetNumThreads() < 2:
63             thread.StepInstruction(False)
64             self.assertEqual(
65                 process.GetState(),
66                 lldb.eStateStopped,
67                 PROCESS_STOPPED)
68             self.assertEqual(
69                 thread.GetStopReason(),
70                 lldb.eStopReasonPlanComplete,
71                 "Step operation succeeded")
72             if self.TraceOn():
73                 self.runCmd("disassemble --pc")
74
75         if self.TraceOn():
76             self.runCmd("thread list")
77
78         # We have successfully caught thread creation. Now just run to
79         # completion
80         process.Continue()
81
82         # At this point, the inferior process should have exited.
83         self.assertEqual(process.GetState(), lldb.eStateExited, PROCESS_EXITED)