""" 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): NO_DEBUG_INFO_TESTCASE = True def test(self): platform_stop_reason = lldb.eStopReasonSignal platform = self.getPlatform() if self.platformIsDarwin() or platform == "windows": platform_stop_reason = lldb.eStopReasonException self.build() (target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint( self, "// Set a breakpoint here", lldb.SBFileSpec("main.c") ) # 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(), platform_stop_reason ) 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(), platform_stop_reason ) # "global" is now 10. self.assertEqual(global_value.GetValueAsUnsigned(), 10) # Change the handling of SIGILL on Linux - do not pass it to the # inferior, but stop and notify lldb. If we don't do this, the # inferior will receive the SIGILL and be terminated. On x86_64, # __builtin_trap() emits UD2; on ARM it emits UDF — both generate # SIGILL. AArch64 uses BRK #1 (SIGTRAP, already suppressed by # default), so this is harmless there. if platform == "linux": self.runCmd("process handle -p false SIGILL") # 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(), platform_stop_reason ) # "global" is still 10. self.assertEqual(global_value.GetValueAsUnsigned(), 10)