diff options
Diffstat (limited to 'packages/Python/lldbsuite/test/functionalities/inferior-crashing/TestInferiorCrashing.py')
-rw-r--r-- | packages/Python/lldbsuite/test/functionalities/inferior-crashing/TestInferiorCrashing.py | 119 |
1 files changed, 76 insertions, 43 deletions
diff --git a/packages/Python/lldbsuite/test/functionalities/inferior-crashing/TestInferiorCrashing.py b/packages/Python/lldbsuite/test/functionalities/inferior-crashing/TestInferiorCrashing.py index fd6a9abce36e..d058b1cac560 100644 --- a/packages/Python/lldbsuite/test/functionalities/inferior-crashing/TestInferiorCrashing.py +++ b/packages/Python/lldbsuite/test/functionalities/inferior-crashing/TestInferiorCrashing.py @@ -3,74 +3,94 @@ from __future__ import print_function - -import os, time +import os +import time import lldb from lldbsuite.test import lldbutil from lldbsuite.test import lldbplatformutil from lldbsuite.test.decorators import * from lldbsuite.test.lldbtest import * + class CrashingInferiorTestCase(TestBase): mydir = TestBase.compute_mydir(__file__) - @expectedFailureAll(oslist=['freebsd'], bugnumber="llvm.org/pr23699 SIGSEGV is reported as exception, not signal") - @expectedFailureAll(oslist=["windows"], bugnumber="llvm.org/pr24778, This actually works, but the test relies on the output format instead of the API") + @expectedFailureAll( + oslist=['freebsd'], + bugnumber="llvm.org/pr23699 SIGSEGV is reported as exception, not signal") + @expectedFailureAll( + oslist=["windows"], + bugnumber="llvm.org/pr24778, This actually works, but the test relies on the output format instead of the API") def test_inferior_crashing(self): """Test that lldb reliably catches the inferior crashing (command).""" self.build() self.inferior_crashing() - @expectedFailureAll(oslist=["windows"], bugnumber="llvm.org/pr24778, This actually works, but the test relies on the output format instead of the API") + @expectedFailureAll( + oslist=["windows"], + bugnumber="llvm.org/pr24778, This actually works, but the test relies on the output format instead of the API") def test_inferior_crashing_register(self): """Test that lldb reliably reads registers from the inferior after crashing (command).""" self.build() self.inferior_crashing_registers() @add_test_categories(['pyapi']) - @expectedFailureAll(oslist=["windows"], bugnumber="llvm.org/pr24778, This actually works, but the test relies on the output format instead of the API") + @expectedFailureAll( + oslist=["windows"], + bugnumber="llvm.org/pr24778, This actually works, but the test relies on the output format instead of the API") def test_inferior_crashing_python(self): """Test that lldb reliably catches the inferior crashing (Python API).""" self.build() self.inferior_crashing_python() - @expectedFailureAll(oslist=["windows"], bugnumber="llvm.org/pr24778, This actually works, but the test relies on the output format instead of the API") + @expectedFailureAll( + oslist=["windows"], + bugnumber="llvm.org/pr24778, This actually works, but the test relies on the output format instead of the API") def test_inferior_crashing_expr(self): """Test that the lldb expression interpreter can read from the inferior after crashing (command).""" self.build() self.inferior_crashing_expr() - @expectedFailureAll(oslist=["windows"], bugnumber="llvm.org/pr24778, This actually works, but the test relies on the output format instead of the API") + @expectedFailureAll( + oslist=["windows"], + bugnumber="llvm.org/pr24778, This actually works, but the test relies on the output format instead of the API") def test_inferior_crashing_step(self): """Test that stepping after a crash behaves correctly.""" self.build() self.inferior_crashing_step() @expectedFailureAll(oslist=['freebsd'], bugnumber='llvm.org/pr24939') - @expectedFailureAll(oslist=["windows"], bugnumber="llvm.org/pr24778, This actually works, but the test relies on the output format instead of the API") - @expectedFailureAndroid(archs=['aarch64'], api_levels=list(range(21 + 1))) # No eh_frame for sa_restorer + @expectedFailureAll( + oslist=["windows"], + bugnumber="llvm.org/pr24778, This actually works, but the test relies on the output format instead of the API") + @skipIfTargetAndroid() # debuggerd interferes with this test on Android def test_inferior_crashing_step_after_break(self): """Test that lldb functions correctly after stepping through a crash.""" self.build() self.inferior_crashing_step_after_break() - @expectedFailureAll(oslist=["windows"], bugnumber="llvm.org/pr24778, This actually works, but the test relies on the output format instead of the API") - @skipIfLinux # Inferior exits after stepping after a segfault. This is working as intended IMHO. + @expectedFailureAll( + oslist=["windows"], + bugnumber="llvm.org/pr24778, This actually works, but the test relies on the output format instead of the API") + # Inferior exits after stepping after a segfault. This is working as + # intended IMHO. + @skipIfLinux def test_inferior_crashing_expr_step_and_expr(self): """Test that lldb expressions work before and after stepping after a crash.""" self.build() self.inferior_crashing_expr_step_expr() def set_breakpoint(self, line): - lldbutil.run_break_set_by_file_and_line (self, "main.c", line, num_expected_locations=1, loc_exact=True) + lldbutil.run_break_set_by_file_and_line( + self, "main.c", line, num_expected_locations=1, loc_exact=True) def check_stop_reason(self): # We should have one crashing thread self.assertEqual( - len(lldbutil.get_crashed_threads(self, self.dbg.GetSelectedTarget().GetProcess())), - 1, - STOPPED_DUE_TO_EXC_BAD_ACCESS) + len(lldbutil.get_crashed_threads(self, self.dbg.GetSelectedTarget().GetProcess())), + 1, + STOPPED_DUE_TO_EXC_BAD_ACCESS) def get_api_stop_reason(self): return lldb.eStopReasonException @@ -95,13 +115,13 @@ class CrashingInferiorTestCase(TestBase): else: stop_reason = 'stop reason = invalid address' self.expect("thread list", STOPPED_DUE_TO_EXC_BAD_ACCESS, - substrs = ['stopped', - stop_reason]) + substrs=['stopped', + stop_reason]) # And it should report the correct line number. self.expect("thread backtrace all", - substrs = [stop_reason, - 'main.c:%d' % self.line]) + substrs=[stop_reason, + 'main.c:%d' % self.line]) def inferior_crashing_python(self): """Inferior crashes upon launching; lldb should catch the event and stop.""" @@ -112,7 +132,8 @@ class CrashingInferiorTestCase(TestBase): # Now launch the process, and do not stop at entry point. # Both argv and envp are null. - process = target.LaunchSimple (None, None, self.get_process_working_directory()) + process = target.LaunchSimple( + None, None, self.get_process_working_directory()) if process.GetState() != lldb.eStateStopped: self.fail("Process should be in the 'stopped' state, " @@ -120,7 +141,10 @@ class CrashingInferiorTestCase(TestBase): lldbutil.state_type_to_str(process.GetState())) threads = lldbutil.get_crashed_threads(self, process) - self.assertEqual(len(threads), 1, "Failed to stop the thread upon bad access exception") + self.assertEqual( + len(threads), + 1, + "Failed to stop the thread upon bad access exception") if self.TraceOn(): lldbutil.print_stacktrace(threads[0]) @@ -133,7 +157,8 @@ class CrashingInferiorTestCase(TestBase): self.runCmd("run", RUN_SUCCEEDED) self.check_stop_reason() - # lldb should be able to read from registers from the inferior after crashing. + # lldb should be able to read from registers from the inferior after + # crashing. lldbplatformutil.check_first_register_readable(self) def inferior_crashing_expr(self): @@ -144,12 +169,13 @@ class CrashingInferiorTestCase(TestBase): self.runCmd("run", RUN_SUCCEEDED) self.check_stop_reason() - # The lldb expression interpreter should be able to read from addresses of the inferior after a crash. + # The lldb expression interpreter should be able to read from addresses + # of the inferior after a crash. self.expect("p argc", - startstr = '(int) $0 = 1') + startstr='(int) $0 = 1') self.expect("p hello_world", - substrs = ['Hello']) + substrs=['Hello']) def inferior_crashing_step(self): """Test that lldb functions correctly after stepping through a crash.""" @@ -160,24 +186,26 @@ class CrashingInferiorTestCase(TestBase): self.runCmd("run", RUN_SUCCEEDED) self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT, - substrs = ['main.c:%d' % self.line, - 'stop reason = breakpoint']) + substrs=['main.c:%d' % self.line, + 'stop reason = breakpoint']) self.runCmd("next") self.check_stop_reason() - # The lldb expression interpreter should be able to read from addresses of the inferior after a crash. + # The lldb expression interpreter should be able to read from addresses + # of the inferior after a crash. self.expect("p argv[0]", - substrs = ['a.out']) + substrs=['a.out']) self.expect("p null_ptr", - substrs = ['= 0x0']) + substrs=['= 0x0']) - # lldb should be able to read from registers from the inferior after crashing. + # lldb should be able to read from registers from the inferior after + # crashing. lldbplatformutil.check_first_register_readable(self) # And it should report the correct line number. self.expect("thread backtrace all", - substrs = ['main.c:%d' % self.line]) + substrs=['main.c:%d' % self.line]) def inferior_crashing_step_after_break(self): """Test that lldb behaves correctly when stepping after a crash.""" @@ -187,17 +215,20 @@ class CrashingInferiorTestCase(TestBase): self.runCmd("run", RUN_SUCCEEDED) self.check_stop_reason() - expected_state = 'exited' # Provide the exit code. + expected_state = 'exited' # Provide the exit code. if self.platformIsDarwin(): - expected_state = 'stopped' # TODO: Determine why 'next' and 'continue' have no effect after a crash. - elif re.match(".*-.*-.*-android", self.dbg.GetSelectedPlatform().GetTriple()): - expected_state = 'stopped' # android has a default SEGV handler, which will re-raise the signal, so we come up stopped again + # TODO: Determine why 'next' and 'continue' have no effect after a + # crash. + expected_state = 'stopped' self.expect("next", - substrs = ['Process', expected_state]) + substrs=['Process', expected_state]) if expected_state == 'exited': - self.expect("thread list", error=True,substrs = ['Process must be launched']) + self.expect( + "thread list", + error=True, + substrs=['Process must be launched']) else: self.check_stop_reason() @@ -209,13 +240,15 @@ class CrashingInferiorTestCase(TestBase): self.runCmd("run", RUN_SUCCEEDED) self.check_stop_reason() - # The lldb expression interpreter should be able to read from addresses of the inferior after a crash. + # The lldb expression interpreter should be able to read from addresses + # of the inferior after a crash. self.expect("p argv[0]", - substrs = ['a.out']) + substrs=['a.out']) self.runCmd("next") self.check_stop_reason() - # The lldb expression interpreter should be able to read from addresses of the inferior after a crash. + # The lldb expression interpreter should be able to read from addresses + # of the inferior after a crash. self.expect("p argv[0]", - substrs = ['a.out']) + substrs=['a.out']) |