1*99451b44SJordan Rupprecht""" 2*99451b44SJordan RupprechtTest embedded breakpoints, like `asm int 3;` in x86 or or `__debugbreak` on Windows. 3*99451b44SJordan Rupprecht""" 4*99451b44SJordan Rupprecht 5*99451b44SJordan Rupprecht 6*99451b44SJordan Rupprechtimport lldb 7*99451b44SJordan Rupprechtfrom lldbsuite.test.decorators import * 8*99451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import * 9*99451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil 10*99451b44SJordan Rupprecht 11*99451b44SJordan Rupprecht 12*99451b44SJordan Rupprechtclass DebugBreakTestCase(TestBase): 13*99451b44SJordan Rupprecht 14*99451b44SJordan Rupprecht mydir = TestBase.compute_mydir(__file__) 15*99451b44SJordan Rupprecht 16*99451b44SJordan Rupprecht @skipIf(archs=no_match(["i386", "i686", "x86_64"])) 17*99451b44SJordan Rupprecht @no_debug_info_test 18*99451b44SJordan Rupprecht def test_asm_int_3(self): 19*99451b44SJordan Rupprecht """Test that intrinsics like `__debugbreak();` and `asm {"int3"}` are treated like breakpoints.""" 20*99451b44SJordan Rupprecht self.build() 21*99451b44SJordan Rupprecht exe = self.getBuildArtifact("a.out") 22*99451b44SJordan Rupprecht 23*99451b44SJordan Rupprecht # Run the program. 24*99451b44SJordan Rupprecht target = self.dbg.CreateTarget(exe) 25*99451b44SJordan Rupprecht process = target.LaunchSimple( 26*99451b44SJordan Rupprecht None, None, self.get_process_working_directory()) 27*99451b44SJordan Rupprecht 28*99451b44SJordan Rupprecht # We've hit the first stop, so grab the frame. 29*99451b44SJordan Rupprecht self.assertEqual(process.GetState(), lldb.eStateStopped) 30*99451b44SJordan Rupprecht stop_reason = lldb.eStopReasonException if (lldbplatformutil.getPlatform( 31*99451b44SJordan Rupprecht ) == "windows" or lldbplatformutil.getPlatform() == "macosx") else lldb.eStopReasonSignal 32*99451b44SJordan Rupprecht thread = lldbutil.get_stopped_thread(process, stop_reason) 33*99451b44SJordan Rupprecht self.assertIsNotNone( 34*99451b44SJordan Rupprecht thread, "Unable to find thread stopped at the __debugbreak()") 35*99451b44SJordan Rupprecht frame = thread.GetFrameAtIndex(0) 36*99451b44SJordan Rupprecht 37*99451b44SJordan Rupprecht # We should be in funciton 'bar'. 38*99451b44SJordan Rupprecht self.assertTrue(frame.IsValid()) 39*99451b44SJordan Rupprecht function_name = frame.GetFunctionName() 40*99451b44SJordan Rupprecht self.assertTrue('bar' in function_name, 41*99451b44SJordan Rupprecht "Unexpected function name {}".format(function_name)) 42*99451b44SJordan Rupprecht 43*99451b44SJordan Rupprecht # We should be able to evaluate the parameter foo. 44*99451b44SJordan Rupprecht value = frame.EvaluateExpression('*foo') 45*99451b44SJordan Rupprecht self.assertEqual(value.GetValueAsSigned(), 42) 46*99451b44SJordan Rupprecht 47*99451b44SJordan Rupprecht # The counter should be 1 at the first stop and increase by 2 for each 48*99451b44SJordan Rupprecht # subsequent stop. 49*99451b44SJordan Rupprecht counter = 1 50*99451b44SJordan Rupprecht while counter < 20: 51*99451b44SJordan Rupprecht value = frame.EvaluateExpression('count') 52*99451b44SJordan Rupprecht self.assertEqual(value.GetValueAsSigned(), counter) 53*99451b44SJordan Rupprecht counter += 2 54*99451b44SJordan Rupprecht process.Continue() 55*99451b44SJordan Rupprecht 56*99451b44SJordan Rupprecht # The inferior should exit after the last iteration. 57*99451b44SJordan Rupprecht self.assertEqual(process.GetState(), lldb.eStateExited) 58