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