1ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea"""
2ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel MaleaA stress-test of sorts for LLDB's handling of threads in the inferior.
3ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea
4ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel MaleaThis test sets a breakpoint in the main thread where test parameters (numbers of
5ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Maleathreads) can be adjusted, runs the inferior to that point, and modifies the
6ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malealocals that control the event thread counts. This test also sets a breakpoint in
7ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Maleabreakpoint_func (the function executed by each 'breakpoint' thread) and a
8ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Maleawatchpoint on a global modified in watchpoint_func. The inferior is continued
9ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Maleauntil exit or a crash takes place, and the number of events seen by LLDB is
10ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Maleaverified to match the expected number of events.
11ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea"""
12ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea
13571be4261837300fd56eefc95a602711bf5de5c8Daniel Maleaimport os, signal, time
14ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Maleaimport unittest2
15ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Maleaimport lldb
16ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Maleafrom lldbtest import *
17ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Maleaimport lldbutil
18ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea
19571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea# ==================================================
20571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea# Dictionary of signal names
21571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea# ==================================================
22571be4261837300fd56eefc95a602711bf5de5c8Daniel Maleasignal_names = dict((getattr(signal, n), n) \
23571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea        for n in dir(signal) if n.startswith('SIG') and '_' not in n )
24571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea
25571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea
26ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Maleaclass ConcurrentEventsTestCase(TestBase):
27ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea
28ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    mydir = os.path.join("functionalities", "thread", "concurrent_events")
29ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea
30ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    #
31ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    ## Tests for multiple threads that generate a single event.
32ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    #
33ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    @unittest2.skipIf(TestBase.skipLongRunningTest(), "Skip this long running test")
34ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    @dwarf_test
35ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    def test_many_breakpoints_dwarf(self):
36ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        """Test 100 breakpoints from 100 threads."""
37ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.buildDwarf(dictionary=self.getBuildFlags())
38ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.do_thread_actions(num_breakpoint_threads=100)
39ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea
401475fc76a3b64fd81b710d3a719d6fcc9f6996e2Daniel Malea    @skipIfLinux # llvm.org/pr16714 - LLDB sometimes crashes when setting watchpoints in multithreaded programs
41ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    @unittest2.skipIf(TestBase.skipLongRunningTest(), "Skip this long running test")
42ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    @dwarf_test
43ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    def test_many_watchpoints_dwarf(self):
44ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        """Test 100 watchpoints from 100 threads."""
45ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.buildDwarf(dictionary=self.getBuildFlags())
46ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.do_thread_actions(num_watchpoint_threads=100)
47ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea
48ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    @unittest2.skipIf(TestBase.skipLongRunningTest(), "Skip this long running test")
49ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    @dwarf_test
50ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    def test_many_signals_dwarf(self):
51ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        """Test 100 signals from 100 threads."""
52ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.buildDwarf(dictionary=self.getBuildFlags())
53ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.do_thread_actions(num_signal_threads=100)
54ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea
55ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    @unittest2.skipIf(TestBase.skipLongRunningTest(), "Skip this long running test")
56ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    @dwarf_test
57ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    def test_many_crash_dwarf(self):
58ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        """Test 100 threads that cause a segfault."""
59ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.buildDwarf(dictionary=self.getBuildFlags())
60ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.do_thread_actions(num_crash_threads=100)
61ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea
62ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea
63ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    #
64ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    ## Tests for concurrent signal and breakpoint
65ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    #
664fd912f5de9a61a4e23f2a1973659f0c334a2692Ed Maste    @expectedFailureFreeBSD("llvm.org/pr16696") # threaded inferior not yet implemented on FreeBSD
67ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    @dwarf_test
68ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    def test_signal_break_dwarf(self):
69ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        """Test signal and a breakpoint in multiple threads."""
70ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.buildDwarf(dictionary=self.getBuildFlags())
71ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.do_thread_actions(num_breakpoint_threads=1, num_signal_threads=1)
72ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea
734fd912f5de9a61a4e23f2a1973659f0c334a2692Ed Maste    @expectedFailureFreeBSD("llvm.org/pr16696") # threaded inferior not yet implemented on FreeBSD
74ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    @dwarf_test
75ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    def test_delay_signal_break_dwarf(self):
76ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        """Test (1-second delay) signal and a breakpoint in multiple threads."""
77ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.buildDwarf(dictionary=self.getBuildFlags())
78ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.do_thread_actions(num_breakpoint_threads=1, num_delay_signal_threads=1)
79ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea
804fd912f5de9a61a4e23f2a1973659f0c334a2692Ed Maste    @expectedFailureFreeBSD("llvm.org/pr16696") # threaded inferior not yet implemented on FreeBSD
81ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    @dwarf_test
82ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    def test_signal_delay_break_dwarf(self):
83ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        """Test signal and a (1 second delay) breakpoint in multiple threads."""
84ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.buildDwarf(dictionary=self.getBuildFlags())
85ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.do_thread_actions(num_delay_breakpoint_threads=1, num_signal_threads=1)
86ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea
87ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea
88ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    #
89ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    ## Tests for concurrent watchpoint and breakpoint
90ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    #
91ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    @dwarf_test
921475fc76a3b64fd81b710d3a719d6fcc9f6996e2Daniel Malea    @skipIfLinux # llvm.org/pr16714 - LLDB sometimes crashes when setting watchpoints in multithreaded programs
93ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    def test_watch_break_dwarf(self):
94ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        """Test watchpoint and a breakpoint in multiple threads."""
95ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.buildDwarf(dictionary=self.getBuildFlags())
96ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.do_thread_actions(num_breakpoint_threads=1, num_watchpoint_threads=1)
97ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea
983bf526ac0f51dda6f63be3421cd7de68720dd656Ed Maste    @expectedFailureFreeBSD('llvm.org/pr16706') # Watchpoints fail on FreeBSD
99ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    @dwarf_test
1001475fc76a3b64fd81b710d3a719d6fcc9f6996e2Daniel Malea    @skipIfLinux # llvm.org/pr16714 - LLDB sometimes crashes when setting watchpoints in multithreaded programs
101ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    def test_delay_watch_break_dwarf(self):
102ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        """Test (1-second delay) watchpoint and a breakpoint in multiple threads."""
103ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.buildDwarf(dictionary=self.getBuildFlags())
104ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.do_thread_actions(num_breakpoint_threads=1, num_delay_watchpoint_threads=1)
105ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea
1063bf526ac0f51dda6f63be3421cd7de68720dd656Ed Maste    @expectedFailureFreeBSD('llvm.org/pr16706') # Watchpoints fail on FreeBSD
107ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    @dwarf_test
1081475fc76a3b64fd81b710d3a719d6fcc9f6996e2Daniel Malea    @skipIfLinux # llvm.org/pr16714 - LLDB sometimes crashes when setting watchpoints in multithreaded programs
109ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    def test_watch_break_dwarf(self):
110ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        """Test watchpoint and a (1 second delay) breakpoint in multiple threads."""
111ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.buildDwarf(dictionary=self.getBuildFlags())
112ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.do_thread_actions(num_delay_breakpoint_threads=1, num_watchpoint_threads=1)
113ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea
114ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    #
115ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    ## Tests for concurrent signal and watchpoint
116ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    #
1173bf526ac0f51dda6f63be3421cd7de68720dd656Ed Maste    @expectedFailureFreeBSD('llvm.org/pr16706') # Watchpoints fail on FreeBSD
118ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    @dwarf_test
1191475fc76a3b64fd81b710d3a719d6fcc9f6996e2Daniel Malea    @skipIfLinux # llvm.org/pr16714 - LLDB sometimes crashes when setting watchpoints in multithreaded programs
120ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    def test_signal_watch_dwarf(self):
121ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        """Test a watchpoint and a signal in multiple threads."""
122ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.buildDwarf(dictionary=self.getBuildFlags())
123ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.do_thread_actions(num_signal_threads=1, num_watchpoint_threads=1)
124ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea
1253bf526ac0f51dda6f63be3421cd7de68720dd656Ed Maste    @expectedFailureFreeBSD('llvm.org/pr16706') # Watchpoints fail on FreeBSD
126ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    @dwarf_test
1271475fc76a3b64fd81b710d3a719d6fcc9f6996e2Daniel Malea    @skipIfLinux # llvm.org/pr16714 - LLDB sometimes crashes when setting watchpoints in multithreaded programs
128ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    def test_delay_signal_watch_dwarf(self):
129ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        """Test a watchpoint and a (1 second delay) signal in multiple threads."""
130ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.buildDwarf(dictionary=self.getBuildFlags())
131ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.do_thread_actions(num_delay_signal_threads=1, num_watchpoint_threads=1)
132ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea
1333bf526ac0f51dda6f63be3421cd7de68720dd656Ed Maste    @expectedFailureFreeBSD('llvm.org/pr16706') # Watchpoints fail on FreeBSD
134ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    @dwarf_test
1351475fc76a3b64fd81b710d3a719d6fcc9f6996e2Daniel Malea    @skipIfLinux # llvm.org/pr16714 - LLDB sometimes crashes when setting watchpoints in multithreaded programs
136ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    def test_signal_delay_watch_dwarf(self):
137ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        """Test a (1 second delay) watchpoint and a signal in multiple threads."""
138ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.buildDwarf(dictionary=self.getBuildFlags())
139ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.do_thread_actions(num_signal_threads=1, num_delay_watchpoint_threads=1)
140ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea
141ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea
142ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    #
143ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    ## Tests for multiple breakpoint threads
144ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    #
1454fd912f5de9a61a4e23f2a1973659f0c334a2692Ed Maste    @expectedFailureFreeBSD("llvm.org/pr16696") # threaded inferior not yet implemented on FreeBSD
146ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    @dwarf_test
147ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    def test_two_breakpoint_threads_dwarf(self):
148ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        """Test two threads that trigger a breakpoint. """
149ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.buildDwarf(dictionary=self.getBuildFlags())
150ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.do_thread_actions(num_breakpoint_threads=2)
151ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea
1524fd912f5de9a61a4e23f2a1973659f0c334a2692Ed Maste    @expectedFailureFreeBSD("llvm.org/pr16696") # threaded inferior not yet implemented on FreeBSD
153ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    @dwarf_test
154ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    def test_breakpoint_one_delay_breakpoint_threads_dwarf(self):
155ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        """Test threads that trigger a breakpoint where one thread has a 1 second delay. """
156ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.buildDwarf(dictionary=self.getBuildFlags())
157ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.do_thread_actions(num_breakpoint_threads=1,
158ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea                               num_delay_breakpoint_threads=1)
159ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea
1604fd912f5de9a61a4e23f2a1973659f0c334a2692Ed Maste    @expectedFailureFreeBSD("llvm.org/pr16696") # threaded inferior not yet implemented on FreeBSD
161ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    @dwarf_test
162ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    def test_two_breakpoints_one_signal_dwarf(self):
163ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        """Test two threads that trigger a breakpoint and one signal thread. """
164ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.buildDwarf(dictionary=self.getBuildFlags())
165ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.do_thread_actions(num_breakpoint_threads=2, num_signal_threads=1)
166ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea
1674fd912f5de9a61a4e23f2a1973659f0c334a2692Ed Maste    @expectedFailureFreeBSD("llvm.org/pr16696") # threaded inferior not yet implemented on FreeBSD
168ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    @dwarf_test
169ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    def test_breakpoint_delay_breakpoint_one_signal_dwarf(self):
170ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        """Test two threads that trigger a breakpoint (one with a 1 second delay) and one signal thread. """
171ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.buildDwarf(dictionary=self.getBuildFlags())
172ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.do_thread_actions(num_breakpoint_threads=1,
173ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea                               num_delay_breakpoint_threads=1,
174ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea                               num_signal_threads=1)
175ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea
1764fd912f5de9a61a4e23f2a1973659f0c334a2692Ed Maste    @expectedFailureFreeBSD("llvm.org/pr16696") # threaded inferior not yet implemented on FreeBSD
177ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    @dwarf_test
178ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    def test_two_breakpoints_one_delay_signal_dwarf(self):
179ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        """Test two threads that trigger a breakpoint and one (1 second delay) signal thread. """
180ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.buildDwarf(dictionary=self.getBuildFlags())
181ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.do_thread_actions(num_breakpoint_threads=2, num_delay_signal_threads=1)
182ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea
1833bf526ac0f51dda6f63be3421cd7de68720dd656Ed Maste    @expectedFailureFreeBSD('llvm.org/pr16706') # Watchpoints fail on FreeBSD
184ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    @dwarf_test
1851475fc76a3b64fd81b710d3a719d6fcc9f6996e2Daniel Malea    @skipIfLinux # llvm.org/pr16714 - LLDB sometimes crashes when setting watchpoints in multithreaded programs
186ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    def test_two_breakpoints_one_watchpoint_dwarf(self):
187ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        """Test two threads that trigger a breakpoint and one watchpoint thread. """
188ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.buildDwarf(dictionary=self.getBuildFlags())
189ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.do_thread_actions(num_breakpoint_threads=2, num_watchpoint_threads=1)
190ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea
1913bf526ac0f51dda6f63be3421cd7de68720dd656Ed Maste    @expectedFailureFreeBSD('llvm.org/pr16706') # Watchpoints fail on FreeBSD
192ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    @dwarf_test
1931475fc76a3b64fd81b710d3a719d6fcc9f6996e2Daniel Malea    @skipIfLinux # llvm.org/pr16714 - LLDB sometimes crashes when setting watchpoints in multithreaded programs
194ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    def test_breakpoints_delayed_breakpoint_one_watchpoint_dwarf(self):
195ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        """Test a breakpoint, a delayed breakpoint, and one watchpoint thread. """
196ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.buildDwarf(dictionary=self.getBuildFlags())
197ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.do_thread_actions(num_breakpoint_threads=1,
198ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea                               num_delay_breakpoint_threads=1,
199ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea                               num_watchpoint_threads=1)
200ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea
201ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    #
202ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    ## Tests for multiple watchpoint threads
203ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    #
2043bf526ac0f51dda6f63be3421cd7de68720dd656Ed Maste    @expectedFailureFreeBSD('llvm.org/pr16706') # Watchpoints fail on FreeBSD
205ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    @dwarf_test
2061475fc76a3b64fd81b710d3a719d6fcc9f6996e2Daniel Malea    @skipIfLinux # llvm.org/pr16714 - LLDB sometimes crashes when setting watchpoints in multithreaded programs
207ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    def test_two_watchpoint_threads_dwarf(self):
208ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        """Test two threads that trigger a watchpoint. """
209ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.buildDwarf(dictionary=self.getBuildFlags())
210ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.do_thread_actions(num_watchpoint_threads=2)
211ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea
2123bf526ac0f51dda6f63be3421cd7de68720dd656Ed Maste    @expectedFailureFreeBSD('llvm.org/pr16706') # Watchpoints fail on FreeBSD
213ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    @dwarf_test
2141475fc76a3b64fd81b710d3a719d6fcc9f6996e2Daniel Malea    @skipIfLinux # llvm.org/pr16714 - LLDB sometimes crashes when setting watchpoints in multithreaded programs
215ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    def test_watchpoint_with_delay_waychpoint_threads_dwarf(self):
216ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        """Test two threads that trigger a watchpoint where one thread has a 1 second delay. """
217ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.buildDwarf(dictionary=self.getBuildFlags())
218ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.do_thread_actions(num_watchpoint_threads=1,
219ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea                               num_delay_watchpoint_threads=1)
220ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea
2213bf526ac0f51dda6f63be3421cd7de68720dd656Ed Maste    @expectedFailureFreeBSD('llvm.org/pr16706') # Watchpoints fail on FreeBSD
222ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    @dwarf_test
2231475fc76a3b64fd81b710d3a719d6fcc9f6996e2Daniel Malea    @skipIfLinux # llvm.org/pr16714 - LLDB sometimes crashes when setting watchpoints in multithreaded programs
224ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    def test_two_watchpoints_one_breakpoint_dwarf(self):
225ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        """Test two threads that trigger a watchpoint and one breakpoint thread. """
226ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.buildDwarf(dictionary=self.getBuildFlags())
227ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.do_thread_actions(num_watchpoint_threads=2, num_breakpoint_threads=1)
228ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea
2293bf526ac0f51dda6f63be3421cd7de68720dd656Ed Maste    @expectedFailureFreeBSD('llvm.org/pr16706') # Watchpoints fail on FreeBSD
230ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    @dwarf_test
2311475fc76a3b64fd81b710d3a719d6fcc9f6996e2Daniel Malea    @skipIfLinux # llvm.org/pr16714 - LLDB sometimes crashes when setting watchpoints in multithreaded programs
232ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    def test_two_watchpoints_one_delay_breakpoint_dwarf(self):
233ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        """Test two threads that trigger a watchpoint and one (1 second delay) breakpoint thread. """
234ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.buildDwarf(dictionary=self.getBuildFlags())
235ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.do_thread_actions(num_watchpoint_threads=2, num_delay_breakpoint_threads=1)
236ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea
2373bf526ac0f51dda6f63be3421cd7de68720dd656Ed Maste    @expectedFailureFreeBSD('llvm.org/pr16706') # Watchpoints fail on FreeBSD
238ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    @dwarf_test
2391475fc76a3b64fd81b710d3a719d6fcc9f6996e2Daniel Malea    @skipIfLinux # llvm.org/pr16714 - LLDB sometimes crashes when setting watchpoints in multithreaded programs
240ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    def test_watchpoint_delay_watchpoint_one_breakpoint_dwarf(self):
241ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        """Test two threads that trigger a watchpoint (one with a 1 second delay) and one breakpoint thread. """
242ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.buildDwarf(dictionary=self.getBuildFlags())
243ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.do_thread_actions(num_watchpoint_threads=1,
244ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea                               num_delay_watchpoint_threads=1,
245ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea                               num_breakpoint_threads=1)
246ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea
2473bf526ac0f51dda6f63be3421cd7de68720dd656Ed Maste    @expectedFailureFreeBSD('llvm.org/pr16706') # Watchpoints fail on FreeBSD
248ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    @dwarf_test
2491475fc76a3b64fd81b710d3a719d6fcc9f6996e2Daniel Malea    @skipIfLinux # llvm.org/pr16714 - LLDB sometimes crashes when setting watchpoints in multithreaded programs
250ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    def test_two_watchpoints_one_signal_dwarf(self):
251ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        """Test two threads that trigger a watchpoint and one signal thread. """
252ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.buildDwarf(dictionary=self.getBuildFlags())
253ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.do_thread_actions(num_watchpoint_threads=2, num_signal_threads=1)
254ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea
255ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    #
256ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    ## Test for watchpoint, signal and breakpoint happening concurrently
257ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    #
258ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    @dwarf_test
2591475fc76a3b64fd81b710d3a719d6fcc9f6996e2Daniel Malea    @skipIfLinux # llvm.org/pr16714 - LLDB sometimes crashes when setting watchpoints in multithreaded programs
260ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    def test_signal_watch_break_dwarf(self):
261ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        """Test a signal/watchpoint/breakpoint in multiple threads."""
262ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.buildDwarf(dictionary=self.getBuildFlags())
263ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.do_thread_actions(num_signal_threads=1,
264ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea                               num_watchpoint_threads=1,
265ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea                               num_breakpoint_threads=1)
266ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea
267ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    @dwarf_test
2681475fc76a3b64fd81b710d3a719d6fcc9f6996e2Daniel Malea    @skipIfLinux # llvm.org/pr16714 - LLDB sometimes crashes when setting watchpoints in multithreaded programs
269ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    def test_signal_watch_break_dwarf(self):
270ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        """Test one signal thread with 5 watchpoint and breakpoint threads."""
271ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.buildDwarf(dictionary=self.getBuildFlags())
272ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.do_thread_actions(num_signal_threads=1,
273ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea                               num_watchpoint_threads=5,
274ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea                               num_breakpoint_threads=5)
275ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea
2763bf526ac0f51dda6f63be3421cd7de68720dd656Ed Maste    @expectedFailureFreeBSD('llvm.org/pr16706') # Watchpoints fail on FreeBSD
277ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    @dwarf_test
2781475fc76a3b64fd81b710d3a719d6fcc9f6996e2Daniel Malea    @skipIfLinux # llvm.org/pr16714 - LLDB sometimes crashes when setting watchpoints in multithreaded programs
279ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    def test_signal_watch_break_dwarf(self):
280ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        """Test with 5 watchpoint and breakpoint threads."""
281ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.buildDwarf(dictionary=self.getBuildFlags())
282ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.do_thread_actions(num_watchpoint_threads=5,
283ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea                               num_breakpoint_threads=5)
284ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea
285ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea
286ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    #
287ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    ## Test for crashing threads happening concurrently with other events
288ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    #
2894fd912f5de9a61a4e23f2a1973659f0c334a2692Ed Maste    @expectedFailureFreeBSD("llvm.org/pr16696") # threaded inferior not yet implemented on FreeBSD
290ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    @dwarf_test
291ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    def test_crash_with_break_dwarf(self):
292ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        """ Test a thread that crashes while another thread hits a breakpoint."""
293ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.buildDwarf(dictionary=self.getBuildFlags())
294ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.do_thread_actions(num_crash_threads=1, num_breakpoint_threads=1)
295ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea
2963bf526ac0f51dda6f63be3421cd7de68720dd656Ed Maste    @expectedFailureFreeBSD('llvm.org/pr16706') # Watchpoints fail on FreeBSD
297ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    @dwarf_test
2981475fc76a3b64fd81b710d3a719d6fcc9f6996e2Daniel Malea    @skipIfLinux # llvm.org/pr16714 - LLDB sometimes crashes when setting watchpoints in multithreaded programs
299ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    def test_crash_with_watchpoint_dwarf(self):
300ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        """ Test a thread that crashes while another thread hits a watchpoint."""
301ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.buildDwarf(dictionary=self.getBuildFlags())
302ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.do_thread_actions(num_crash_threads=1, num_watchpoint_threads=1)
303ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea
3044fd912f5de9a61a4e23f2a1973659f0c334a2692Ed Maste    @expectedFailureFreeBSD("llvm.org/pr16696") # threaded inferior not yet implemented on FreeBSD
305ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    @dwarf_test
306ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    def test_crash_with_signal_dwarf(self):
307ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        """ Test a thread that crashes while another thread generates a signal."""
308ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.buildDwarf(dictionary=self.getBuildFlags())
309ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.do_thread_actions(num_crash_threads=1, num_signal_threads=1)
310ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea
3113bf526ac0f51dda6f63be3421cd7de68720dd656Ed Maste    @expectedFailureFreeBSD('llvm.org/pr16706') # Watchpoints fail on FreeBSD
312ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    @dwarf_test
3131475fc76a3b64fd81b710d3a719d6fcc9f6996e2Daniel Malea    @skipIfLinux # llvm.org/pr16714 - LLDB sometimes crashes when setting watchpoints in multithreaded programs
314ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    def test_crash_with_watchpoint_breakpoint_signal_dwarf(self):
315ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        """ Test a thread that crashes while other threads generate a signal and hit a watchpoint and breakpoint. """
316ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.buildDwarf(dictionary=self.getBuildFlags())
317ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.do_thread_actions(num_crash_threads=1,
318ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea                               num_breakpoint_threads=1,
319ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea                               num_signal_threads=1,
320ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea                               num_watchpoint_threads=1)
321ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea
3223bf526ac0f51dda6f63be3421cd7de68720dd656Ed Maste    @expectedFailureFreeBSD('llvm.org/pr16706') # Watchpoints fail on FreeBSD
323ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    @dwarf_test
3241475fc76a3b64fd81b710d3a719d6fcc9f6996e2Daniel Malea    @skipIfLinux # llvm.org/pr16714 - LLDB sometimes crashes when setting watchpoints in multithreaded programs
325ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    def test_delayed_crash_with_breakpoint_watchpoint_dwarf(self):
326ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        """ Test a thread with a delayed crash while other threads hit a watchpoint and a breakpoint. """
327ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.buildDwarf(dictionary=self.getBuildFlags())
328ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.do_thread_actions(num_delay_crash_threads=1,
329ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea                               num_breakpoint_threads=1,
330ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea                               num_watchpoint_threads=1)
331ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea
3324fd912f5de9a61a4e23f2a1973659f0c334a2692Ed Maste    @expectedFailureFreeBSD("llvm.org/pr16696") # threaded inferior not yet implemented on FreeBSD
333ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    @dwarf_test
334ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    def test_delayed_crash_with_breakpoint_signal_dwarf(self):
335ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        """ Test a thread with a delayed crash while other threads generate a signal and hit a breakpoint. """
336ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.buildDwarf(dictionary=self.getBuildFlags())
337ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.do_thread_actions(num_delay_crash_threads=1,
338ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea                               num_breakpoint_threads=1,
339ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea                               num_signal_threads=1)
340ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea
341ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    def setUp(self):
342ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        # Call super's setUp().
343ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        TestBase.setUp(self)
344ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        # Find the line number for our breakpoint.
345571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea        self.filename = 'main.cpp'
346571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea        self.thread_breakpoint_line = line_number(self.filename, '// Set breakpoint here')
347571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea        self.setup_breakpoint_line = line_number(self.filename, '// Break here and adjust num')
348571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea        self.finish_breakpoint_line = line_number(self.filename, '// Break here and verify one thread is active')
349571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea
350571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea    def describe_threads(self):
351571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea        ret = []
352571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea        for x in self.inferior_process:
353571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea            id = x.GetIndexID()
354571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea            reason = x.GetStopReason()
355571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea            status = "stopped" if x.IsStopped() else "running"
356571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea            reason_str = lldbutil.stop_reason_to_str(reason)
357571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea            if reason == lldb.eStopReasonBreakpoint:
358571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea                bpid = x.GetStopReasonDataAtIndex(0)
359571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea                bp = self.inferior_target.FindBreakpointByID(bpid)
360571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea                reason_str = "%s hit %d times" % (lldbutil.get_description(bp), bp.GetHitCount())
361571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea            elif reason == lldb.eStopReasonWatchpoint:
362571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea                watchid = x.GetStopReasonDataAtIndex(0)
363571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea                watch = self.inferior_target.FindWatchpointByID(watchid)
364571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea                reason_str = "%s hit %d times" % (lldbutil.get_description(watch), watch.GetHitCount())
365571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea            elif reason == lldb.eStopReasonSignal:
366571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea                reason_str = "signal %s" % (signal_names[x.GetStopReasonDataAtIndex(0)])
367571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea
368571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea            location = "\t".join([lldbutil.get_description(x.GetFrameAtIndex(i)) for i in range(x.GetNumFrames())])
369571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea            ret.append("thread %d %s due to %s at\n\t%s" % (id, status, reason_str, location))
370ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        return ret
371ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea
372571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea    def add_breakpoint(self, line, descriptions):
373571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea        """ Adds a breakpoint at self.filename:line and appends its description to descriptions, and
374571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea            returns the LLDB SBBreakpoint object.
375571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea        """
376571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea
377a04d685a740fc51d4c246b2004adbb5712bdad6fDaniel Malea        bpno = lldbutil.run_break_set_by_file_and_line(self, self.filename, line, num_expected_locations=-1)
378571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea        bp = self.inferior_target.FindBreakpointByID(bpno)
379a04d685a740fc51d4c246b2004adbb5712bdad6fDaniel Malea        descriptions.append(": file = 'main.cpp', line = %d" % self.finish_breakpoint_line)
380571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea        return bp
381571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea
382571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea    def inferior_done(self):
383571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea        """ Returns true if the inferior is done executing all the event threads (and is stopped at self.finish_breakpoint,
384571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea            or has terminated execution.
385571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea        """
386571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea        return self.finish_breakpoint.GetHitCount() > 0 or \
387571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea                self.crash_count > 0 or \
388571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea                self.inferior_process.GetState == lldb.eStateExited
389ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea
390ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    def do_thread_actions(self,
391ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea                          num_breakpoint_threads = 0,
392ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea                          num_signal_threads = 0,
393ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea                          num_watchpoint_threads = 0,
394ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea                          num_crash_threads = 0,
395ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea                          num_delay_breakpoint_threads = 0,
396ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea                          num_delay_signal_threads = 0,
397ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea                          num_delay_watchpoint_threads = 0,
398ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea                          num_delay_crash_threads = 0):
399ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        """ Sets a breakpoint in the main thread where test parameters (numbers of threads) can be adjusted, runs the inferior
400ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea            to that point, and modifies the locals that control the event thread counts. Also sets a breakpoint in
401ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea            breakpoint_func (the function executed by each 'breakpoint' thread) and a watchpoint on a global modified in
402ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea            watchpoint_func. The inferior is continued until exit or a crash takes place, and the number of events seen by LLDB
403ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea            is verified to match the expected number of events.
404ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        """
405ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        exe = os.path.join(os.getcwd(), "a.out")
406ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
407ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea
408571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea        # Get the target
409571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea        self.inferior_target = self.dbg.GetSelectedTarget()
410571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea
411571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea        expected_bps = []
412571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea
413ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        # Initialize all the breakpoints (main thread/aux thread)
414571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea        self.setup_breakpoint = self.add_breakpoint(self.setup_breakpoint_line, expected_bps)
415571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea        self.finish_breakpoint = self.add_breakpoint(self.finish_breakpoint_line, expected_bps)
416571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea
417571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea        # Set the thread breakpoint
418571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea        if num_breakpoint_threads + num_delay_breakpoint_threads > 0:
419571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea            self.thread_breakpoint = self.add_breakpoint(self.thread_breakpoint_line, expected_bps)
420ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea
421571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea        # Verify breakpoints
422571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea        self.expect("breakpoint list -f", "Breakpoint locations shown correctly", substrs = expected_bps)
423ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea
424ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        # Run the program.
425ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.runCmd("run", RUN_SUCCEEDED)
426ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea
427ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        # Check we are at line self.setup_breakpoint
428ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.expect("thread backtrace", STOPPED_DUE_TO_BREAKPOINT,
429ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea            substrs = ["stop reason = breakpoint 1."])
430ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea
431571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea        # Initialize the (single) watchpoint on the global variable (g_watchme)
432ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        if num_watchpoint_threads + num_delay_watchpoint_threads > 0:
433ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea            self.runCmd("watchpoint set variable g_watchme")
434571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea            for w in self.inferior_target.watchpoint_iter():
435571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea                self.thread_watchpoint = w
436571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea                self.assertTrue("g_watchme" in str(self.thread_watchpoint), "Watchpoint location not shown correctly")
437ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea
438571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea        # Get the process
439571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea        self.inferior_process = self.inferior_target.GetProcess()
440ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea
441ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        # We should be stopped at the setup site where we can set the number of
442ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        # threads doing each action (break/crash/signal/watch)
443571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea        self.assertEqual(self.inferior_process.GetNumThreads(), 1, 'Expected to stop before any additional threads are spawned.')
444ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea
445ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.runCmd("expr num_breakpoint_threads=%d" % num_breakpoint_threads)
446ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.runCmd("expr num_crash_threads=%d" % num_crash_threads)
447ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.runCmd("expr num_signal_threads=%d" % num_signal_threads)
448ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.runCmd("expr num_watchpoint_threads=%d" % num_watchpoint_threads)
449ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea
450ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.runCmd("expr num_delay_breakpoint_threads=%d" % num_delay_breakpoint_threads)
451ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.runCmd("expr num_delay_crash_threads=%d" % num_delay_crash_threads)
452ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.runCmd("expr num_delay_signal_threads=%d" % num_delay_signal_threads)
453ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.runCmd("expr num_delay_watchpoint_threads=%d" % num_delay_watchpoint_threads)
454ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea
455571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea        # Continue the inferior so threads are spawned
456ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.runCmd("continue")
457ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea
458ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        # Make sure we see all the threads. The inferior program's threads all synchronize with a pseudo-barrier; that is,
459ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        # the inferior program ensures all threads are started and running before any thread triggers its 'event'.
460571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea        num_threads = self.inferior_process.GetNumThreads()
461ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        expected_num_threads = num_breakpoint_threads + num_delay_breakpoint_threads \
462ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea                             + num_signal_threads + num_delay_signal_threads \
463ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea                             + num_watchpoint_threads + num_delay_watchpoint_threads \
464ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea                             + num_crash_threads + num_delay_crash_threads + 1
465ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        self.assertEqual(num_threads, expected_num_threads,
466571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea            'Expected to see %d threads, but seeing %d. Details:\n%s' % (expected_num_threads,
467571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea                                                                         num_threads,
468571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea                                                                         "\n\t".join(self.describe_threads())))
469571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea
470571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea        self.signal_count = len(lldbutil.get_stopped_threads(self.inferior_process, lldb.eStopReasonSignal))
471571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea        self.crash_count = len(lldbutil.get_stopped_threads(self.inferior_process, lldb.eStopReasonException))
472571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea
473571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea        # Run to completion (or crash)
474571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea        while not self.inferior_done():
475ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea            if self.TraceOn():
476ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea                self.runCmd("thread backtrace all")
477ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea            self.runCmd("continue")
478571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea            self.signal_count += len(lldbutil.get_stopped_threads(self.inferior_process, lldb.eStopReasonSignal))
479571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea            self.crash_count += len(lldbutil.get_stopped_threads(self.inferior_process, lldb.eStopReasonException))
480ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea
481ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        if num_crash_threads > 0 or num_delay_crash_threads > 0:
482ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea            # Expecting a crash
483571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea            self.assertTrue(self.crash_count > 0,
484571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea                "Expecting at least one thread to crash. Details: %s" % "\t\n".join(self.describe_threads()))
485ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea
486ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea            # Ensure the zombie process is reaped
487ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea            self.runCmd("process kill")
488ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea
489ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea        elif num_crash_threads == 0 and num_delay_crash_threads == 0:
490571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea            # There should be a single active thread (the main one) which hit the breakpoint after joining
491571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea            self.assertEqual(1, self.finish_breakpoint.GetHitCount(), "Expected main thread (finish) breakpoint to be hit once")
492571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea
49350851d82b0f0aa415fc0c057b85b2243190366abDaniel Malea            num_threads = self.inferior_process.GetNumThreads()
49450851d82b0f0aa415fc0c057b85b2243190366abDaniel Malea            self.assertEqual(1, num_threads, "Expecting 1 thread but seeing %d. Details:%s" % (num_threads,
49550851d82b0f0aa415fc0c057b85b2243190366abDaniel Malea                                                                                             "\n\t".join(self.describe_threads())))
496571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea            self.runCmd("continue")
497571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea
498ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea            # The inferior process should have exited without crashing
499571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea            self.assertEqual(0, self.crash_count, "Unexpected thread(s) in crashed state")
500571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea            self.assertTrue(self.inferior_process.GetState() == lldb.eStateExited, PROCESS_EXITED)
501ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea
502ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea            # Verify the number of actions took place matches expected numbers
503571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea            expected_breakpoint_threads = num_delay_breakpoint_threads + num_breakpoint_threads
504571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea            breakpoint_hit_count = self.thread_breakpoint.GetHitCount() if expected_breakpoint_threads > 0 else 0
505571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea            self.assertEqual(expected_breakpoint_threads, breakpoint_hit_count,
506571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea                "Expected %d breakpoint hits, but got %d" % (expected_breakpoint_threads, breakpoint_hit_count))
507571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea
508571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea            expected_signal_threads = num_delay_signal_threads + num_signal_threads
509571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea            self.assertEqual(expected_signal_threads, self.signal_count,
5109de79f93e058445afc9f8c131f9a4bb57654fe44Daniel Malea                "Expected %d stops due to signal delivery, but got %d" % (expected_signal_threads, self.signal_count))
511571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea
512571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea            expected_watchpoint_threads = num_delay_watchpoint_threads + num_watchpoint_threads
513571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea            watchpoint_hit_count = self.thread_watchpoint.GetHitCount() if expected_watchpoint_threads > 0 else 0
514571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea            self.assertEqual(expected_watchpoint_threads, watchpoint_hit_count,
515571be4261837300fd56eefc95a602711bf5de5c8Daniel Malea                "Expected %d watchpoint hits, got %d" % (expected_watchpoint_threads, watchpoint_hit_count))
516ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea
517ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea
518ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Maleaif __name__ == '__main__':
519ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    import atexit
520ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    lldb.SBDebugger.Initialize()
521ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    atexit.register(lambda: lldb.SBDebugger.Terminate())
522ff5c6d9c07c02c80b24a59c25d9f5edd518479c4Daniel Malea    unittest2.main()
523