• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1"""
2Test number of threads.
3"""
4
5import os, time
6import unittest2
7import lldb
8from lldbtest import *
9import lldbutil
10
11class ExitDuringBreakpointTestCase(TestBase):
12
13    mydir = os.path.join("functionalities", "thread", "exit_during_break")
14
15    @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin")
16    @expectedFailureDarwin("llvm.org/pr15824") # thread states not properly maintained
17    @dsym_test
18    def test_with_dsym(self):
19        """Test thread exit during breakpoint handling."""
20        self.buildDsym(dictionary=self.getBuildFlags())
21        self.exit_during_breakpoint_test()
22
23    @expectedFailureDarwin("llvm.org/pr15824") # thread states not properly maintained
24    @expectedFailureFreeBSD("llvm.org/pr16696") # threaded inferior not yet implemented on FreeBSD
25    @dwarf_test
26    def test_with_dwarf(self):
27        """Test thread exit during breakpoint handling."""
28        self.buildDwarf(dictionary=self.getBuildFlags())
29        self.exit_during_breakpoint_test()
30
31    def setUp(self):
32        # Call super's setUp().
33        TestBase.setUp(self)
34        # Find the line number for our breakpoint.
35        self.breakpoint = line_number('main.cpp', '// Set breakpoint here')
36
37    def exit_during_breakpoint_test(self):
38        """Test thread exit during breakpoint handling."""
39        exe = os.path.join(os.getcwd(), "a.out")
40        self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
41
42        # This should create a breakpoint in the main thread.
43        lldbutil.run_break_set_by_file_and_line (self, "main.cpp", self.breakpoint, num_expected_locations=1)
44
45        # The breakpoint list should show 1 location.
46        self.expect("breakpoint list -f", "Breakpoint location shown correctly",
47            substrs = ["1: file = 'main.cpp', line = %d, locations = 1" % self.breakpoint])
48
49        # Run the program.
50        self.runCmd("run", RUN_SUCCEEDED)
51
52        # The stop reason of the thread should be breakpoint.
53        self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
54            substrs = ['stopped',
55                       'stop reason = breakpoint'])
56
57        # Get the target process
58        target = self.dbg.GetSelectedTarget()
59        process = target.GetProcess()
60
61        # The exit probably occured during breakpoint handling, but it isn't
62        # guaranteed.  The main thing we're testing here is that the debugger
63        # handles this cleanly is some way.
64
65        # Get the number of threads
66        num_threads = process.GetNumThreads()
67
68        # Make sure we see at least five threads
69        self.assertTrue(num_threads >= 5, 'Number of expected threads and actual threads do not match.')
70
71        # Get the thread objects
72        thread1 = process.GetThreadAtIndex(0)
73        thread2 = process.GetThreadAtIndex(1)
74        thread3 = process.GetThreadAtIndex(2)
75        thread4 = process.GetThreadAtIndex(3)
76        thread5 = process.GetThreadAtIndex(4)
77
78        # Make sure all threads are stopped
79        self.assertTrue(thread1.IsStopped(), "Thread 1 didn't stop during breakpoint")
80        self.assertTrue(thread2.IsStopped(), "Thread 2 didn't stop during breakpoint")
81        self.assertTrue(thread3.IsStopped(), "Thread 3 didn't stop during breakpoint")
82        self.assertTrue(thread4.IsStopped(), "Thread 4 didn't stop during breakpoint")
83        self.assertTrue(thread5.IsStopped(), "Thread 5 didn't stop during breakpoint")
84
85        # Run to completion
86        self.runCmd("continue")
87
88        # At this point, the inferior process should have exited.
89        self.assertTrue(process.GetState() == lldb.eStateExited, PROCESS_EXITED)
90
91if __name__ == '__main__':
92    import atexit
93    lldb.SBDebugger.Initialize()
94    atexit.register(lambda: lldb.SBDebugger.Terminate())
95    unittest2.main()
96