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 mydir = TestBase.compute_mydir(__file__) 1599451b44SJordan Rupprecht 1699451b44SJordan Rupprecht @skipIf(archs=no_match(["i386", "i686", "x86_64"])) 1799451b44SJordan Rupprecht @no_debug_info_test 1899451b44SJordan Rupprecht def test_asm_int_3(self): 1999451b44SJordan Rupprecht """Test that intrinsics like `__debugbreak();` and `asm {"int3"}` are treated like breakpoints.""" 2099451b44SJordan Rupprecht self.build() 2199451b44SJordan Rupprecht exe = self.getBuildArtifact("a.out") 2299451b44SJordan Rupprecht 2399451b44SJordan Rupprecht # Run the program. 2499451b44SJordan Rupprecht target = self.dbg.CreateTarget(exe) 2599451b44SJordan Rupprecht process = target.LaunchSimple( 2699451b44SJordan Rupprecht None, None, self.get_process_working_directory()) 2799451b44SJordan Rupprecht 2899451b44SJordan Rupprecht # We've hit the first stop, so grab the frame. 2999451b44SJordan Rupprecht self.assertEqual(process.GetState(), lldb.eStateStopped) 3099451b44SJordan Rupprecht stop_reason = lldb.eStopReasonException if (lldbplatformutil.getPlatform( 3199451b44SJordan Rupprecht ) == "windows" or lldbplatformutil.getPlatform() == "macosx") else lldb.eStopReasonSignal 3299451b44SJordan Rupprecht thread = lldbutil.get_stopped_thread(process, stop_reason) 3399451b44SJordan Rupprecht self.assertIsNotNone( 3499451b44SJordan Rupprecht thread, "Unable to find thread stopped at the __debugbreak()") 3599451b44SJordan Rupprecht frame = thread.GetFrameAtIndex(0) 3699451b44SJordan Rupprecht 3799451b44SJordan Rupprecht # We should be in funciton 'bar'. 3899451b44SJordan Rupprecht self.assertTrue(frame.IsValid()) 3999451b44SJordan Rupprecht function_name = frame.GetFunctionName() 40*3cc37622SDave Lee self.assertIn('bar', function_name, 4199451b44SJordan Rupprecht "Unexpected function name {}".format(function_name)) 4299451b44SJordan Rupprecht 4399451b44SJordan Rupprecht # We should be able to evaluate the parameter foo. 4499451b44SJordan Rupprecht value = frame.EvaluateExpression('*foo') 4599451b44SJordan Rupprecht self.assertEqual(value.GetValueAsSigned(), 42) 4699451b44SJordan Rupprecht 4799451b44SJordan Rupprecht # The counter should be 1 at the first stop and increase by 2 for each 4899451b44SJordan Rupprecht # subsequent stop. 4999451b44SJordan Rupprecht counter = 1 5099451b44SJordan Rupprecht while counter < 20: 5199451b44SJordan Rupprecht value = frame.EvaluateExpression('count') 5299451b44SJordan Rupprecht self.assertEqual(value.GetValueAsSigned(), counter) 5399451b44SJordan Rupprecht counter += 2 5499451b44SJordan Rupprecht process.Continue() 5599451b44SJordan Rupprecht 5699451b44SJordan Rupprecht # The inferior should exit after the last iteration. 5799451b44SJordan Rupprecht self.assertEqual(process.GetState(), lldb.eStateExited) 58