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