199451b44SJordan Rupprecht""" 299451b44SJordan RupprechtTest embedded breakpoints, like `asm int 3;` in x86 or or `__debugbreak` on Windows. 399451b44SJordan Rupprecht""" 499451b44SJordan Rupprecht 599451b44SJordan Rupprecht 699451b44SJordan Rupprechtimport lldb 799451b44SJordan Rupprechtfrom lldbsuite.test.decorators import * 899451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import * 999451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil 1099451b44SJordan Rupprecht 1199451b44SJordan Rupprecht 1299451b44SJordan Rupprechtclass DebugBreakTestCase(TestBase): 1399451b44SJordan Rupprecht 1499451b44SJordan Rupprecht @skipIf(archs=no_match(["i386", "i686", "x86_64"])) 1599451b44SJordan Rupprecht @no_debug_info_test 1699451b44SJordan Rupprecht def test_asm_int_3(self): 1799451b44SJordan Rupprecht """Test that intrinsics like `__debugbreak();` and `asm {"int3"}` are treated like breakpoints.""" 1899451b44SJordan Rupprecht self.build() 1999451b44SJordan Rupprecht exe = self.getBuildArtifact("a.out") 2099451b44SJordan Rupprecht 2199451b44SJordan Rupprecht # Run the program. 2299451b44SJordan Rupprecht target = self.dbg.CreateTarget(exe) 2399451b44SJordan Rupprecht process = target.LaunchSimple( 2499451b44SJordan Rupprecht None, None, self.get_process_working_directory()) 2599451b44SJordan Rupprecht 2699451b44SJordan Rupprecht # We've hit the first stop, so grab the frame. 2747c4c6a7SDave Lee self.assertState(process.GetState(), lldb.eStateStopped) 2899451b44SJordan Rupprecht stop_reason = lldb.eStopReasonException if (lldbplatformutil.getPlatform( 2999451b44SJordan Rupprecht ) == "windows" or lldbplatformutil.getPlatform() == "macosx") else lldb.eStopReasonSignal 3099451b44SJordan Rupprecht thread = lldbutil.get_stopped_thread(process, stop_reason) 3199451b44SJordan Rupprecht self.assertIsNotNone( 3299451b44SJordan Rupprecht thread, "Unable to find thread stopped at the __debugbreak()") 3399451b44SJordan Rupprecht frame = thread.GetFrameAtIndex(0) 3499451b44SJordan Rupprecht 3599451b44SJordan Rupprecht # We should be in funciton 'bar'. 3699451b44SJordan Rupprecht self.assertTrue(frame.IsValid()) 3799451b44SJordan Rupprecht function_name = frame.GetFunctionName() 383cc37622SDave Lee self.assertIn('bar', function_name, 3999451b44SJordan Rupprecht "Unexpected function name {}".format(function_name)) 4099451b44SJordan Rupprecht 4199451b44SJordan Rupprecht # We should be able to evaluate the parameter foo. 4299451b44SJordan Rupprecht value = frame.EvaluateExpression('*foo') 4399451b44SJordan Rupprecht self.assertEqual(value.GetValueAsSigned(), 42) 4499451b44SJordan Rupprecht 4599451b44SJordan Rupprecht # The counter should be 1 at the first stop and increase by 2 for each 4699451b44SJordan Rupprecht # subsequent stop. 4799451b44SJordan Rupprecht counter = 1 4899451b44SJordan Rupprecht while counter < 20: 4999451b44SJordan Rupprecht value = frame.EvaluateExpression('count') 5099451b44SJordan Rupprecht self.assertEqual(value.GetValueAsSigned(), counter) 5199451b44SJordan Rupprecht counter += 2 5299451b44SJordan Rupprecht process.Continue() 5399451b44SJordan Rupprecht 5499451b44SJordan Rupprecht # The inferior should exit after the last iteration. 55*1b8c7352SJonas Devlieghere self.assertState(process.GetState(), lldb.eStateExited) 56