| """ |
| Test that lldb can continue past a __builtin_debugtrap, but not a __builtin_trap |
| """ |
| |
| import lldb |
| import lldbsuite.test.lldbutil as lldbutil |
| from lldbsuite.test.decorators import * |
| from lldbsuite.test.lldbtest import * |
| |
| class BuiltinDebugTrapTestCase(TestBase): |
| |
| mydir = TestBase.compute_mydir(__file__) |
| |
| NO_DEBUG_INFO_TESTCASE = True |
| |
| # Currently this depends on behavior in debugserver to |
| # advance the pc past __builtin_trap instructions so that |
| # continue works. Everyone is in agreement that this |
| # should be moved up into lldb instead of depending on the |
| # remote stub rewriting the pc values. |
| @skipUnlessDarwin |
| |
| def test(self): |
| self.build() |
| (target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint( |
| self, "// Set a breakpoint here", lldb.SBFileSpec("main.cpp")) |
| |
| # Continue to __builtin_debugtrap() |
| process.Continue() |
| if self.TraceOn(): |
| self.runCmd("f") |
| self.runCmd("bt") |
| self.runCmd("ta v global") |
| |
| self.assertEqual(process.GetSelectedThread().GetStopReason(), |
| lldb.eStopReasonException) |
| |
| list = target.FindGlobalVariables("global", 1, lldb.eMatchTypeNormal) |
| self.assertEqual(list.GetSize(), 1) |
| global_value = list.GetValueAtIndex(0) |
| |
| self.assertEqual(global_value.GetValueAsUnsigned(), 5) |
| |
| # Continue to the __builtin_trap() -- we should be able to |
| # continue past __builtin_debugtrap. |
| process.Continue() |
| if self.TraceOn(): |
| self.runCmd("f") |
| self.runCmd("bt") |
| self.runCmd("ta v global") |
| |
| self.assertEqual(process.GetSelectedThread().GetStopReason(), |
| lldb.eStopReasonException) |
| |
| # "global" is now 10. |
| self.assertEqual(global_value.GetValueAsUnsigned(), 10) |
| |
| # We should be at the same point as before -- cannot advance |
| # past a __builtin_trap(). |
| process.Continue() |
| if self.TraceOn(): |
| self.runCmd("f") |
| self.runCmd("bt") |
| self.runCmd("ta v global") |
| |
| self.assertEqual(process.GetSelectedThread().GetStopReason(), |
| lldb.eStopReasonException) |
| |
| # "global" is still 10. |
| self.assertEqual(global_value.GetValueAsUnsigned(), 10) |