xref: /llvm-project/lldb/test/API/functionalities/thread/multi_break/TestMultipleBreakpoints.py (revision d7dbe2c4a00ba2abd998328ad6b8023637bc71d9)
1"""
2Test number of threads.
3"""
4
5
6
7import lldb
8from lldbsuite.test.decorators import *
9from lldbsuite.test.lldbtest import *
10from lldbsuite.test import lldbutil
11
12
13class MultipleBreakpointTestCase(TestBase):
14
15    mydir = TestBase.compute_mydir(__file__)
16
17    def setUp(self):
18        # Call super's setUp().
19        TestBase.setUp(self)
20        # Find the line number for our breakpoint.
21        self.breakpoint = line_number('main.cpp', '// Set breakpoint here')
22
23    @expectedFailureAll(
24        oslist=["linux"],
25        bugnumber="llvm.org/pr15824 thread states not properly maintained")
26    @expectedFailureAll(
27        oslist=lldbplatformutil.getDarwinOSTriples(),
28        bugnumber="llvm.org/pr15824 thread states not properly maintained and <rdar://problem/28557237>")
29    @expectedFailureAll(
30        oslist=["freebsd"],
31        bugnumber="llvm.org/pr18190 thread states not properly maintained")
32    @skipIfWindows # This is flakey on Windows: llvm.org/pr24668, llvm.org/pr38373
33    @expectedFailureNetBSD
34    def test(self):
35        """Test simultaneous breakpoints in multiple threads."""
36        self.build()
37        exe = self.getBuildArtifact("a.out")
38        self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
39
40        # This should create a breakpoint in the main thread.
41        lldbutil.run_break_set_by_file_and_line(
42            self, "main.cpp", self.breakpoint, num_expected_locations=1)
43
44        # Run the program.
45        self.runCmd("run", RUN_SUCCEEDED)
46
47        # The stop reason of the thread should be breakpoint.
48        # The breakpoint may be hit in either thread 2 or thread 3.
49        self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
50                    substrs=['stopped',
51                             'stop reason = breakpoint'])
52
53        # Get the target process
54        target = self.dbg.GetSelectedTarget()
55        process = target.GetProcess()
56
57        # Get the number of threads
58        num_threads = process.GetNumThreads()
59
60        # Make sure we see all three threads
61        self.assertTrue(
62            num_threads >= 3,
63            'Number of expected threads and actual threads do not match.')
64
65        # Get the thread objects
66        thread1 = process.GetThreadAtIndex(0)
67        thread2 = process.GetThreadAtIndex(1)
68        thread3 = process.GetThreadAtIndex(2)
69
70        # Make sure both threads are stopped
71        self.assertTrue(
72            thread1.IsStopped(),
73            "Primary thread didn't stop during breakpoint")
74        self.assertTrue(
75            thread2.IsStopped(),
76            "Secondary thread didn't stop during breakpoint")
77        self.assertTrue(
78            thread3.IsStopped(),
79            "Tertiary thread didn't stop during breakpoint")
80
81        # Delete the first breakpoint then continue
82        self.runCmd("breakpoint delete 1")
83
84        # Run to completion
85        self.runCmd("continue")
86
87        # At this point, the inferior process should have exited.
88        self.assertEqual(
89            process.GetState(), lldb.eStateExited,
90            PROCESS_EXITED)
91