1"""Test for the JITLoaderGDB interface""" 2 3 4import os 5import lldb 6from lldbsuite.test import lldbutil 7from lldbsuite.test.decorators import * 8from lldbsuite.test.lldbtest import * 9 10 11class JITLoaderGDBTestCase(TestBase): 12 @skipTestIfFn( 13 lambda: "Skipped because the test crashes the test runner", 14 bugnumber="llvm.org/pr24702", 15 ) 16 @expectedFailure("llvm.org/pr24702") 17 def test_bogus_values(self): 18 """Test that we handle inferior misusing the GDB JIT interface""" 19 self.build() 20 exe = self.getBuildArtifact("a.out") 21 22 # Create a target by the debugger. 23 target = self.dbg.CreateTarget(exe) 24 self.assertTrue(target, VALID_TARGET) 25 26 # Launch the process, do not stop at entry point. 27 process = target.LaunchSimple(None, None, self.get_process_working_directory()) 28 self.assertTrue(process, PROCESS_IS_VALID) 29 30 # The inferior will now pass bogus values over the interface. Make sure 31 # we don't crash. 32 self.assertState(process.GetState(), lldb.eStateExited) 33 self.assertEqual(process.GetExitStatus(), 0) 34 35 def gen_log_file(self): 36 logfile = self.getBuildArtifact( 37 "jitintgdb-{}.txt".format(self.getArchitecture()) 38 ) 39 40 def cleanup(): 41 if os.path.exists(logfile): 42 os.unlink(logfile) 43 44 self.addTearDownHook(cleanup) 45 return logfile 46 47 def test_jit_int_default(self): 48 self.expect( 49 "settings show plugin.jit-loader.gdb.enable", 50 substrs=["plugin.jit-loader.gdb.enable (enum) = default"], 51 ) 52 53 @skipIfWindows # This test fails on Windows during C code build 54 def test_jit_int_on(self): 55 """Tests interface with 'enable' settings 'on'""" 56 self.build() 57 exe = self.getBuildArtifact("simple") 58 59 logfile = self.gen_log_file() 60 self.runCmd("log enable -f %s lldb jit" % (logfile)) 61 self.runCmd("settings set plugin.jit-loader.gdb.enable on") 62 63 def cleanup(): 64 self.runCmd("log disable lldb") 65 self.runCmd("settings set plugin.jit-loader.gdb.enable default") 66 67 self.addTearDownHook(cleanup) 68 69 # Launch the process. 70 target = self.dbg.CreateTarget(exe) 71 self.assertTrue(target, VALID_TARGET) 72 process = target.LaunchSimple(None, None, self.get_process_working_directory()) 73 self.assertTrue(process, PROCESS_IS_VALID) 74 75 self.assertState(process.GetState(), lldb.eStateExited) 76 self.assertEqual(process.GetExitStatus(), 0) 77 78 self.assertTrue(os.path.exists(logfile)) 79 logcontent = open(logfile).read() 80 self.assertIn("SetJITBreakpoint setting JIT breakpoint", logcontent) 81 82 @skipIfWindows # This test fails on Windows during C code build 83 def test_jit_int_off(self): 84 """Tests interface with 'enable' settings 'off'""" 85 self.build() 86 exe = self.getBuildArtifact("simple") 87 88 logfile = self.gen_log_file() 89 self.runCmd("log enable -f %s lldb jit" % (logfile)) 90 self.runCmd("settings set plugin.jit-loader.gdb.enable off") 91 92 def cleanup(): 93 self.runCmd("log disable lldb") 94 self.runCmd("settings set plugin.jit-loader.gdb.enable default") 95 96 self.addTearDownHook(cleanup) 97 98 # Launch the process. 99 target = self.dbg.CreateTarget(exe) 100 self.assertTrue(target, VALID_TARGET) 101 process = target.LaunchSimple(None, None, self.get_process_working_directory()) 102 self.assertTrue(process, PROCESS_IS_VALID) 103 104 self.assertState(process.GetState(), lldb.eStateExited) 105 self.assertEqual(process.GetExitStatus(), 0) 106 107 self.assertTrue(os.path.exists(logfile)) 108 logcontent = open(logfile).read() 109 self.assertNotIn("SetJITBreakpoint setting JIT breakpoint", logcontent) 110