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