1*99451b44SJordan Rupprecht""" 2*99451b44SJordan RupprechtTest that you can set breakpoint commands successfully with the Python API's: 3*99451b44SJordan Rupprecht""" 4*99451b44SJordan Rupprecht 5*99451b44SJordan Rupprechtfrom __future__ import print_function 6*99451b44SJordan Rupprecht 7*99451b44SJordan Rupprecht 8*99451b44SJordan Rupprechtimport lldb 9*99451b44SJordan Rupprechtfrom lldbsuite.test.decorators import * 10*99451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import * 11*99451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil 12*99451b44SJordan Rupprechtimport side_effect 13*99451b44SJordan Rupprecht 14*99451b44SJordan Rupprecht 15*99451b44SJordan Rupprechtclass PythonBreakpointCommandSettingTestCase(TestBase): 16*99451b44SJordan Rupprecht 17*99451b44SJordan Rupprecht mydir = TestBase.compute_mydir(__file__) 18*99451b44SJordan Rupprecht NO_DEBUG_INFO_TESTCASE = True 19*99451b44SJordan Rupprecht 20*99451b44SJordan Rupprecht @add_test_categories(['pyapi']) 21*99451b44SJordan Rupprecht def test_step_out_python(self): 22*99451b44SJordan Rupprecht """Test stepping out using a python breakpoint command.""" 23*99451b44SJordan Rupprecht self.build() 24*99451b44SJordan Rupprecht self.do_set_python_command_from_python() 25*99451b44SJordan Rupprecht 26*99451b44SJordan Rupprecht def test_bkpt_cmd_bad_arguments(self): 27*99451b44SJordan Rupprecht """Test what happens when pass structured data to a command:""" 28*99451b44SJordan Rupprecht self.build() 29*99451b44SJordan Rupprecht self.do_bad_args_to_python_command() 30*99451b44SJordan Rupprecht 31*99451b44SJordan Rupprecht def setUp(self): 32*99451b44SJordan Rupprecht TestBase.setUp(self) 33*99451b44SJordan Rupprecht self.main_source = "main.c" 34*99451b44SJordan Rupprecht self.main_source_spec = lldb.SBFileSpec(self.main_source) 35*99451b44SJordan Rupprecht 36*99451b44SJordan Rupprecht def do_set_python_command_from_python(self): 37*99451b44SJordan Rupprecht exe = self.getBuildArtifact("a.out") 38*99451b44SJordan Rupprecht error = lldb.SBError() 39*99451b44SJordan Rupprecht 40*99451b44SJordan Rupprecht self.target = self.dbg.CreateTarget(exe) 41*99451b44SJordan Rupprecht self.assertTrue(self.target, VALID_TARGET) 42*99451b44SJordan Rupprecht 43*99451b44SJordan Rupprecht body_bkpt = self.target.BreakpointCreateBySourceRegex( 44*99451b44SJordan Rupprecht "Set break point at this line.", self.main_source_spec) 45*99451b44SJordan Rupprecht self.assertTrue(body_bkpt, VALID_BREAKPOINT) 46*99451b44SJordan Rupprecht 47*99451b44SJordan Rupprecht func_bkpt = self.target.BreakpointCreateBySourceRegex( 48*99451b44SJordan Rupprecht "Set break point at this line.", self.main_source_spec) 49*99451b44SJordan Rupprecht self.assertTrue(func_bkpt, VALID_BREAKPOINT) 50*99451b44SJordan Rupprecht 51*99451b44SJordan Rupprecht fancy_bkpt = self.target.BreakpointCreateBySourceRegex( 52*99451b44SJordan Rupprecht "Set break point at this line.", self.main_source_spec) 53*99451b44SJordan Rupprecht self.assertTrue(fancy_bkpt, VALID_BREAKPOINT) 54*99451b44SJordan Rupprecht 55*99451b44SJordan Rupprecht fancier_bkpt = self.target.BreakpointCreateBySourceRegex( 56*99451b44SJordan Rupprecht "Set break point at this line.", self.main_source_spec) 57*99451b44SJordan Rupprecht self.assertTrue(fancier_bkpt, VALID_BREAKPOINT) 58*99451b44SJordan Rupprecht 59*99451b44SJordan Rupprecht not_so_fancy_bkpt = self.target.BreakpointCreateBySourceRegex( 60*99451b44SJordan Rupprecht "Set break point at this line.", self.main_source_spec) 61*99451b44SJordan Rupprecht self.assertTrue(not_so_fancy_bkpt, VALID_BREAKPOINT) 62*99451b44SJordan Rupprecht 63*99451b44SJordan Rupprecht # Also test that setting a source regex breakpoint with an empty file 64*99451b44SJordan Rupprecht # spec list sets it on all files: 65*99451b44SJordan Rupprecht no_files_bkpt = self.target.BreakpointCreateBySourceRegex( 66*99451b44SJordan Rupprecht "Set a breakpoint here", lldb.SBFileSpecList(), lldb.SBFileSpecList()) 67*99451b44SJordan Rupprecht self.assertTrue(no_files_bkpt, VALID_BREAKPOINT) 68*99451b44SJordan Rupprecht num_locations = no_files_bkpt.GetNumLocations() 69*99451b44SJordan Rupprecht self.assertTrue( 70*99451b44SJordan Rupprecht num_locations >= 2, 71*99451b44SJordan Rupprecht "Got at least two breakpoint locations") 72*99451b44SJordan Rupprecht got_one_in_A = False 73*99451b44SJordan Rupprecht got_one_in_B = False 74*99451b44SJordan Rupprecht for idx in range(0, num_locations): 75*99451b44SJordan Rupprecht comp_unit = no_files_bkpt.GetLocationAtIndex(idx).GetAddress().GetSymbolContext( 76*99451b44SJordan Rupprecht lldb.eSymbolContextCompUnit).GetCompileUnit().GetFileSpec() 77*99451b44SJordan Rupprecht print("Got comp unit: ", comp_unit.GetFilename()) 78*99451b44SJordan Rupprecht if comp_unit.GetFilename() == "a.c": 79*99451b44SJordan Rupprecht got_one_in_A = True 80*99451b44SJordan Rupprecht elif comp_unit.GetFilename() == "b.c": 81*99451b44SJordan Rupprecht got_one_in_B = True 82*99451b44SJordan Rupprecht 83*99451b44SJordan Rupprecht self.assertTrue(got_one_in_A, "Failed to match the pattern in A") 84*99451b44SJordan Rupprecht self.assertTrue(got_one_in_B, "Failed to match the pattern in B") 85*99451b44SJordan Rupprecht self.target.BreakpointDelete(no_files_bkpt.GetID()) 86*99451b44SJordan Rupprecht 87*99451b44SJordan Rupprecht error = lldb.SBError() 88*99451b44SJordan Rupprecht error = body_bkpt.SetScriptCallbackBody( 89*99451b44SJordan Rupprecht "import side_effect; side_effect.callback = 'callback was here'") 90*99451b44SJordan Rupprecht self.assertTrue( 91*99451b44SJordan Rupprecht error.Success(), 92*99451b44SJordan Rupprecht "Failed to set the script callback body: %s." % 93*99451b44SJordan Rupprecht (error.GetCString())) 94*99451b44SJordan Rupprecht 95*99451b44SJordan Rupprecht self.expect("command script import --allow-reload ./bktptcmd.py") 96*99451b44SJordan Rupprecht 97*99451b44SJordan Rupprecht func_bkpt.SetScriptCallbackFunction("bktptcmd.function") 98*99451b44SJordan Rupprecht 99*99451b44SJordan Rupprecht extra_args = lldb.SBStructuredData() 100*99451b44SJordan Rupprecht stream = lldb.SBStream() 101*99451b44SJordan Rupprecht stream.Print('{"side_effect" : "I am fancy"}') 102*99451b44SJordan Rupprecht extra_args.SetFromJSON(stream) 103*99451b44SJordan Rupprecht error = fancy_bkpt.SetScriptCallbackFunction("bktptcmd.another_function", extra_args) 104*99451b44SJordan Rupprecht self.assertTrue(error.Success(), "Failed to add callback %s"%(error.GetCString())) 105*99451b44SJordan Rupprecht 106*99451b44SJordan Rupprecht stream.Clear() 107*99451b44SJordan Rupprecht stream.Print('{"side_effect" : "I am so much fancier"}') 108*99451b44SJordan Rupprecht extra_args.SetFromJSON(stream) 109*99451b44SJordan Rupprecht 110*99451b44SJordan Rupprecht # Fancier's callback is set up from the command line 111*99451b44SJordan Rupprecht id = fancier_bkpt.GetID() 112*99451b44SJordan Rupprecht self.expect("breakpoint command add -F bktptcmd.a_third_function -k side_effect -v 'I am fancier' %d"%(id)) 113*99451b44SJordan Rupprecht 114*99451b44SJordan Rupprecht # Not so fancy gets an empty extra_args: 115*99451b44SJordan Rupprecht empty_args = lldb.SBStructuredData() 116*99451b44SJordan Rupprecht error = not_so_fancy_bkpt.SetScriptCallbackFunction("bktptcmd.empty_extra_args", empty_args) 117*99451b44SJordan Rupprecht self.assertTrue(error.Success(), "Failed to add callback %s"%(error.GetCString())) 118*99451b44SJordan Rupprecht 119*99451b44SJordan Rupprecht # Clear out canary variables 120*99451b44SJordan Rupprecht side_effect.bktptcmd = None 121*99451b44SJordan Rupprecht side_effect.callback = None 122*99451b44SJordan Rupprecht side_effect.fancy = None 123*99451b44SJordan Rupprecht side_effect.fancier = None 124*99451b44SJordan Rupprecht side_effect.not_so_fancy = None 125*99451b44SJordan Rupprecht 126*99451b44SJordan Rupprecht # Now launch the process, and do not stop at entry point. 127*99451b44SJordan Rupprecht self.process = self.target.LaunchSimple( 128*99451b44SJordan Rupprecht None, None, self.get_process_working_directory()) 129*99451b44SJordan Rupprecht 130*99451b44SJordan Rupprecht self.assertTrue(self.process, PROCESS_IS_VALID) 131*99451b44SJordan Rupprecht 132*99451b44SJordan Rupprecht # Now finish, and make sure the return value is correct. 133*99451b44SJordan Rupprecht threads = lldbutil.get_threads_stopped_at_breakpoint( 134*99451b44SJordan Rupprecht self.process, body_bkpt) 135*99451b44SJordan Rupprecht self.assertEquals(len(threads), 1, "Stopped at inner breakpoint.") 136*99451b44SJordan Rupprecht self.thread = threads[0] 137*99451b44SJordan Rupprecht 138*99451b44SJordan Rupprecht self.assertEquals("callback was here", side_effect.callback) 139*99451b44SJordan Rupprecht self.assertEquals("function was here", side_effect.bktptcmd) 140*99451b44SJordan Rupprecht self.assertEquals("I am fancy", side_effect.fancy) 141*99451b44SJordan Rupprecht self.assertEquals("I am fancier", side_effect.fancier) 142*99451b44SJordan Rupprecht self.assertEquals("Not so fancy", side_effect.not_so_fancy) 143*99451b44SJordan Rupprecht 144*99451b44SJordan Rupprecht def do_bad_args_to_python_command(self): 145*99451b44SJordan Rupprecht exe = self.getBuildArtifact("a.out") 146*99451b44SJordan Rupprecht error = lldb.SBError() 147*99451b44SJordan Rupprecht 148*99451b44SJordan Rupprecht self.target = self.dbg.CreateTarget(exe) 149*99451b44SJordan Rupprecht self.assertTrue(self.target, VALID_TARGET) 150*99451b44SJordan Rupprecht 151*99451b44SJordan Rupprecht 152*99451b44SJordan Rupprecht self.expect("command script import --allow-reload ./bktptcmd.py") 153*99451b44SJordan Rupprecht 154*99451b44SJordan Rupprecht bkpt = self.target.BreakpointCreateBySourceRegex( 155*99451b44SJordan Rupprecht "Set break point at this line.", self.main_source_spec) 156*99451b44SJordan Rupprecht self.assertTrue(bkpt, VALID_BREAKPOINT) 157*99451b44SJordan Rupprecht 158*99451b44SJordan Rupprecht # Pass a breakpoint command function that doesn't take extra_args, 159*99451b44SJordan Rupprecht # but pass it extra args: 160*99451b44SJordan Rupprecht 161*99451b44SJordan Rupprecht extra_args = lldb.SBStructuredData() 162*99451b44SJordan Rupprecht stream = lldb.SBStream() 163*99451b44SJordan Rupprecht stream.Print('{"side_effect" : "I am fancy"}') 164*99451b44SJordan Rupprecht extra_args.SetFromJSON(stream) 165*99451b44SJordan Rupprecht 166*99451b44SJordan Rupprecht error = bkpt.SetScriptCallbackFunction("bktptcmd.function", extra_args) 167*99451b44SJordan Rupprecht self.assertTrue(error.Fail(), "Can't pass extra args if the function doesn't take them") 168*99451b44SJordan Rupprecht 169*99451b44SJordan Rupprecht error = bkpt.SetScriptCallbackFunction("bktptcmd.useless_function", extra_args) 170*99451b44SJordan Rupprecht self.assertTrue(error.Fail(), "Can't pass extra args if the function has wrong number of args.") 171*99451b44SJordan Rupprecht 172*99451b44SJordan Rupprecht error = bkpt.SetScriptCallbackFunction("bktptcmd.nosuch_function", extra_args) 173*99451b44SJordan Rupprecht self.assertTrue(error.Fail(), "Can't pass extra args if the function doesn't exist.") 174*99451b44SJordan Rupprecht 175