TestInferiorCrashing.py revision 3d8ae4681b81b42a404ad77a231c6f743040e644
1d2dff7bf2355c992b446d8a3c11690bfa24ce998Johnny Chen"""Test that lldb reliably catches the inferior crashing.""" 2d2dff7bf2355c992b446d8a3c11690bfa24ce998Johnny Chen 3d2dff7bf2355c992b446d8a3c11690bfa24ce998Johnny Chenimport os, time 4d2dff7bf2355c992b446d8a3c11690bfa24ce998Johnny Chenimport unittest2 5d2dff7bf2355c992b446d8a3c11690bfa24ce998Johnny Chenimport lldb 6d2dff7bf2355c992b446d8a3c11690bfa24ce998Johnny Chenfrom lldbtest import * 7d2dff7bf2355c992b446d8a3c11690bfa24ce998Johnny Chen 8d2dff7bf2355c992b446d8a3c11690bfa24ce998Johnny Chenclass CrashingInferiorTestCase(TestBase): 9d2dff7bf2355c992b446d8a3c11690bfa24ce998Johnny Chen 10d2dff7bf2355c992b446d8a3c11690bfa24ce998Johnny Chen mydir = "inferior-crashing" 11d2dff7bf2355c992b446d8a3c11690bfa24ce998Johnny Chen 12d2dff7bf2355c992b446d8a3c11690bfa24ce998Johnny Chen @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin") 13d2dff7bf2355c992b446d8a3c11690bfa24ce998Johnny Chen def test_inferior_crashing_dsym(self): 14d2dff7bf2355c992b446d8a3c11690bfa24ce998Johnny Chen """Test that lldb reliably catches the inferior crashing (command).""" 15d2dff7bf2355c992b446d8a3c11690bfa24ce998Johnny Chen self.buildDsym() 16d2dff7bf2355c992b446d8a3c11690bfa24ce998Johnny Chen self.inferior_crashing() 17d2dff7bf2355c992b446d8a3c11690bfa24ce998Johnny Chen 18d2dff7bf2355c992b446d8a3c11690bfa24ce998Johnny Chen def test_inferior_crashing_dwarf(self): 19d2dff7bf2355c992b446d8a3c11690bfa24ce998Johnny Chen """Test that lldb reliably catches the inferior crashing (command).""" 20d2dff7bf2355c992b446d8a3c11690bfa24ce998Johnny Chen self.buildDwarf() 21d2dff7bf2355c992b446d8a3c11690bfa24ce998Johnny Chen self.inferior_crashing() 22d2dff7bf2355c992b446d8a3c11690bfa24ce998Johnny Chen 23d2dff7bf2355c992b446d8a3c11690bfa24ce998Johnny Chen @python_api_test 24d2dff7bf2355c992b446d8a3c11690bfa24ce998Johnny Chen def test_inferior_crashing_python(self): 25d2dff7bf2355c992b446d8a3c11690bfa24ce998Johnny Chen """Test that lldb reliably catches the inferior crashing (Python API).""" 26d2dff7bf2355c992b446d8a3c11690bfa24ce998Johnny Chen self.buildDefault() 27d2dff7bf2355c992b446d8a3c11690bfa24ce998Johnny Chen self.inferior_crashing_python() 28d2dff7bf2355c992b446d8a3c11690bfa24ce998Johnny Chen 29d2dff7bf2355c992b446d8a3c11690bfa24ce998Johnny Chen def setUp(self): 30d2dff7bf2355c992b446d8a3c11690bfa24ce998Johnny Chen # Call super's setUp(). 31d2dff7bf2355c992b446d8a3c11690bfa24ce998Johnny Chen TestBase.setUp(self) 32d2dff7bf2355c992b446d8a3c11690bfa24ce998Johnny Chen # Find the line number of the crash. 33d2dff7bf2355c992b446d8a3c11690bfa24ce998Johnny Chen self.line = line_number('main.c', '// Crash here.') 34d2dff7bf2355c992b446d8a3c11690bfa24ce998Johnny Chen 35d2dff7bf2355c992b446d8a3c11690bfa24ce998Johnny Chen def inferior_crashing(self): 36d2dff7bf2355c992b446d8a3c11690bfa24ce998Johnny Chen """Inferior crashes upon launching; lldb should catch the event and stop.""" 37d2dff7bf2355c992b446d8a3c11690bfa24ce998Johnny Chen exe = os.path.join(os.getcwd(), "a.out") 38d2dff7bf2355c992b446d8a3c11690bfa24ce998Johnny Chen self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET) 39d2dff7bf2355c992b446d8a3c11690bfa24ce998Johnny Chen 40d2dff7bf2355c992b446d8a3c11690bfa24ce998Johnny Chen self.runCmd("run", RUN_SUCCEEDED) 41d2dff7bf2355c992b446d8a3c11690bfa24ce998Johnny Chen 42d2dff7bf2355c992b446d8a3c11690bfa24ce998Johnny Chen # The stop reason of the thread should be a bad access exception. 43d2dff7bf2355c992b446d8a3c11690bfa24ce998Johnny Chen self.expect("thread list", STOPPED_DUE_TO_EXC_BAD_ACCESS, 44abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton substrs = ['stopped', 45d2dff7bf2355c992b446d8a3c11690bfa24ce998Johnny Chen 'stop reason = EXC_BAD_ACCESS']) 46d2dff7bf2355c992b446d8a3c11690bfa24ce998Johnny Chen 47d2dff7bf2355c992b446d8a3c11690bfa24ce998Johnny Chen # And it should report the correct line number. 48219b929e8916448492575d824529655b473a0024Johnny Chen self.expect("thread backtrace all", 49d2dff7bf2355c992b446d8a3c11690bfa24ce998Johnny Chen substrs = ['stop reason = EXC_BAD_ACCESS', 50d2dff7bf2355c992b446d8a3c11690bfa24ce998Johnny Chen 'main.c:%d' % self.line]) 51d2dff7bf2355c992b446d8a3c11690bfa24ce998Johnny Chen 52d2dff7bf2355c992b446d8a3c11690bfa24ce998Johnny Chen def inferior_crashing_python(self): 53d2dff7bf2355c992b446d8a3c11690bfa24ce998Johnny Chen """Inferior crashes upon launching; lldb should catch the event and stop.""" 54d2dff7bf2355c992b446d8a3c11690bfa24ce998Johnny Chen exe = os.path.join(os.getcwd(), "a.out") 55d2dff7bf2355c992b446d8a3c11690bfa24ce998Johnny Chen 56d2dff7bf2355c992b446d8a3c11690bfa24ce998Johnny Chen target = self.dbg.CreateTarget(exe) 57805fec7ec90a09b94bc4515fcac9b2b03bae153bJohnny Chen self.assertTrue(target, VALID_TARGET) 58d2dff7bf2355c992b446d8a3c11690bfa24ce998Johnny Chen 59d2dff7bf2355c992b446d8a3c11690bfa24ce998Johnny Chen # Now launch the process, and do not stop at entry point. 60d2dff7bf2355c992b446d8a3c11690bfa24ce998Johnny Chen # Both argv and envp are null. 613d8ae4681b81b42a404ad77a231c6f743040e644Johnny Chen process = target.LaunchSimple(None, None, os.getcwd()) 62d2dff7bf2355c992b446d8a3c11690bfa24ce998Johnny Chen 63d2dff7bf2355c992b446d8a3c11690bfa24ce998Johnny Chen import lldbutil 643d8ae4681b81b42a404ad77a231c6f743040e644Johnny Chen if process.GetState() != lldb.eStateStopped: 65d2dff7bf2355c992b446d8a3c11690bfa24ce998Johnny Chen self.fail("Process should be in the 'stopped' state, " 66d2dff7bf2355c992b446d8a3c11690bfa24ce998Johnny Chen "instead the actual state is: '%s'" % 673d8ae4681b81b42a404ad77a231c6f743040e644Johnny Chen lldbutil.state_type_to_str(process.GetState())) 68d2dff7bf2355c992b446d8a3c11690bfa24ce998Johnny Chen 693d8ae4681b81b42a404ad77a231c6f743040e644Johnny Chen thread = lldbutil.get_stopped_thread(process, lldb.eStopReasonException) 70d2dff7bf2355c992b446d8a3c11690bfa24ce998Johnny Chen if not thread: 716b41e0b08cac8a59bda19907eb71c05eb36c3af6Johnny Chen self.fail("Fail to stop the thread upon bad access exception") 72d2dff7bf2355c992b446d8a3c11690bfa24ce998Johnny Chen 73ab6378a047f71aec5a12aeaf65ac2380f5ef808cJohnny Chen if self.TraceOn(): 74318aaa0b4b593ec3e69c5962bddab10c47066c4fJohnny Chen lldbutil.print_stacktrace(thread) 75d2dff7bf2355c992b446d8a3c11690bfa24ce998Johnny Chen 76d2dff7bf2355c992b446d8a3c11690bfa24ce998Johnny Chenif __name__ == '__main__': 77d2dff7bf2355c992b446d8a3c11690bfa24ce998Johnny Chen import atexit 78d2dff7bf2355c992b446d8a3c11690bfa24ce998Johnny Chen lldb.SBDebugger.Initialize() 79d2dff7bf2355c992b446d8a3c11690bfa24ce998Johnny Chen atexit.register(lambda: lldb.SBDebugger.Terminate()) 80d2dff7bf2355c992b446d8a3c11690bfa24ce998Johnny Chen unittest2.main() 81