import lldb import subprocess import os from lldbsuite.test.decorators import * from lldbsuite.test.lldbtest import * from lldbsuite.test import lldbutil class TestMSVCRTCException(TestBase): NO_DEBUG_INFO_TESTCASE = True @skipUnlessPlatform(["windows"]) @skipUnlessMSVC def test_msvc_runtime_checks(self): """Test that lldb prints MSVC's runtime checks exceptions as stop reasons.""" src = os.path.join(self.getSourceDir(), "main.c") exe = os.path.join(self.getBuildDir(), "a.exe") result = subprocess.run( ["cl.exe", "/nologo", "/Od", "/Zi", "/MDd", "/RTC1", "/Fe" + exe, src], cwd=self.getBuildDir(), capture_output=True, text=True, ) self.assertEqual( result.returncode, 0, "Compilation failed:\n" + result.stdout + result.stderr, ) target = self.dbg.CreateTarget(exe) self.assertTrue(target.IsValid(), "Could not create target") process = target.LaunchSimple(None, None, self.get_process_working_directory()) self.assertTrue(process.IsValid(), "Could not launch process") self.assertEqual(process.GetState(), lldb.eStateStopped) thread = lldbutil.get_stopped_thread(process, lldb.eStopReasonException) self.assertIsNotNone(thread, "No thread stopped with exception stop reason") stop_description = thread.GetStopDescription(256) self.assertIn( "Run-time check failure", stop_description, "Stop reason does not mention run-time check failure", ) self.assertIn( "variable 'x' is being used without being initialized", stop_description, "Stop reason does not mention uninitialized variable 'x'", )