199451b44SJordan Rupprecht""" 299451b44SJordan RupprechtTest lldb breakpoint command add/list/delete. 399451b44SJordan Rupprecht""" 499451b44SJordan Rupprecht 599451b44SJordan Rupprecht 699451b44SJordan Rupprecht 799451b44SJordan Rupprechtimport lldb 899451b44SJordan Rupprechtfrom lldbsuite.test.decorators import * 999451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import * 1099451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil 1199451b44SJordan Rupprechtimport side_effect 1299451b44SJordan Rupprecht 1399451b44SJordan Rupprecht 1499451b44SJordan Rupprechtclass BreakpointCommandTestCase(TestBase): 1599451b44SJordan Rupprecht 1699451b44SJordan Rupprecht NO_DEBUG_INFO_TESTCASE = True 1799451b44SJordan Rupprecht 1899451b44SJordan Rupprecht @expectedFailureAll(oslist=["windows"], bugnumber="llvm.org/pr24528") 190a68443bSWalter Erquinigo def test_breakpoint_command_sequence(self): 2099451b44SJordan Rupprecht """Test a sequence of breakpoint command add, list, and delete.""" 2199451b44SJordan Rupprecht self.build() 2299451b44SJordan Rupprecht self.breakpoint_command_sequence() 2399451b44SJordan Rupprecht 2499451b44SJordan Rupprecht @skipIf(oslist=["windows"], bugnumber="llvm.org/pr44431") 2599451b44SJordan Rupprecht def test_script_parameters(self): 2699451b44SJordan Rupprecht """Test a sequence of breakpoint command add, list, and delete.""" 2799451b44SJordan Rupprecht self.build() 2899451b44SJordan Rupprecht self.breakpoint_command_script_parameters() 2999451b44SJordan Rupprecht 3099451b44SJordan Rupprecht def test_commands_on_creation(self): 3199451b44SJordan Rupprecht self.build() 3299451b44SJordan Rupprecht self.breakpoint_commands_on_creation() 3399451b44SJordan Rupprecht 3499451b44SJordan Rupprecht def setUp(self): 3599451b44SJordan Rupprecht # Call super's setUp(). 3699451b44SJordan Rupprecht TestBase.setUp(self) 3799451b44SJordan Rupprecht # Find the line number to break inside main(). 3899451b44SJordan Rupprecht self.line = line_number('main.c', '// Set break point at this line.') 3999451b44SJordan Rupprecht # disable "There is a running process, kill it and restart?" prompt 4099451b44SJordan Rupprecht self.runCmd("settings set auto-confirm true") 4199451b44SJordan Rupprecht self.addTearDownHook( 4299451b44SJordan Rupprecht lambda: self.runCmd("settings clear auto-confirm")) 4399451b44SJordan Rupprecht 4499451b44SJordan Rupprecht def test_delete_all_breakpoints(self): 4599451b44SJordan Rupprecht """Test that deleting all breakpoints works.""" 4699451b44SJordan Rupprecht self.build() 4799451b44SJordan Rupprecht exe = self.getBuildArtifact("a.out") 4899451b44SJordan Rupprecht self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET) 4999451b44SJordan Rupprecht 5099451b44SJordan Rupprecht lldbutil.run_break_set_by_symbol(self, "main") 5199451b44SJordan Rupprecht lldbutil.run_break_set_by_file_and_line( 5299451b44SJordan Rupprecht self, "main.c", self.line, num_expected_locations=1, loc_exact=True) 5399451b44SJordan Rupprecht 5499451b44SJordan Rupprecht self.runCmd("run", RUN_SUCCEEDED) 5599451b44SJordan Rupprecht 5699451b44SJordan Rupprecht self.runCmd("breakpoint delete") 5799451b44SJordan Rupprecht self.runCmd("process continue") 5899451b44SJordan Rupprecht self.expect("process status", PROCESS_STOPPED, 5999451b44SJordan Rupprecht patterns=['Process .* exited with status = 0']) 6099451b44SJordan Rupprecht 6199451b44SJordan Rupprecht 6299451b44SJordan Rupprecht def breakpoint_command_sequence(self): 6399451b44SJordan Rupprecht """Test a sequence of breakpoint command add, list, and delete.""" 6499451b44SJordan Rupprecht exe = self.getBuildArtifact("a.out") 6599451b44SJordan Rupprecht self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET) 6699451b44SJordan Rupprecht 6799451b44SJordan Rupprecht # Add three breakpoints on the same line. The first time we don't specify the file, 6899451b44SJordan Rupprecht # since the default file is the one containing main: 6999451b44SJordan Rupprecht lldbutil.run_break_set_by_file_and_line( 7099451b44SJordan Rupprecht self, None, self.line, num_expected_locations=1, loc_exact=True) 7199451b44SJordan Rupprecht lldbutil.run_break_set_by_file_and_line( 7299451b44SJordan Rupprecht self, "main.c", self.line, num_expected_locations=1, loc_exact=True) 7399451b44SJordan Rupprecht lldbutil.run_break_set_by_file_and_line( 7499451b44SJordan Rupprecht self, "main.c", self.line, num_expected_locations=1, loc_exact=True) 7599451b44SJordan Rupprecht # Breakpoint 4 - set at the same location as breakpoint 1 to test 7699451b44SJordan Rupprecht # setting breakpoint commands on two breakpoints at a time 7799451b44SJordan Rupprecht lldbutil.run_break_set_by_file_and_line( 7899451b44SJordan Rupprecht self, None, self.line, num_expected_locations=1, loc_exact=True) 7999451b44SJordan Rupprecht # Make sure relative path source breakpoints work as expected. We test 8099451b44SJordan Rupprecht # with partial paths with and without "./" prefixes. 8199451b44SJordan Rupprecht lldbutil.run_break_set_by_file_and_line( 8299451b44SJordan Rupprecht self, "./main.c", self.line, 8399451b44SJordan Rupprecht num_expected_locations=1, loc_exact=True) 8499451b44SJordan Rupprecht lldbutil.run_break_set_by_file_and_line( 8599451b44SJordan Rupprecht self, "breakpoint_command/main.c", self.line, 8699451b44SJordan Rupprecht num_expected_locations=1, loc_exact=True) 8799451b44SJordan Rupprecht lldbutil.run_break_set_by_file_and_line( 8899451b44SJordan Rupprecht self, "./breakpoint_command/main.c", self.line, 8999451b44SJordan Rupprecht num_expected_locations=1, loc_exact=True) 9099451b44SJordan Rupprecht lldbutil.run_break_set_by_file_and_line( 9199451b44SJordan Rupprecht self, "breakpoint/breakpoint_command/main.c", self.line, 9299451b44SJordan Rupprecht num_expected_locations=1, loc_exact=True) 9399451b44SJordan Rupprecht lldbutil.run_break_set_by_file_and_line( 9499451b44SJordan Rupprecht self, "./breakpoint/breakpoint_command/main.c", self.line, 9599451b44SJordan Rupprecht num_expected_locations=1, loc_exact=True) 9699451b44SJordan Rupprecht # Test relative breakpoints with incorrect paths and make sure we get 9799451b44SJordan Rupprecht # no breakpoint locations 9899451b44SJordan Rupprecht lldbutil.run_break_set_by_file_and_line( 9999451b44SJordan Rupprecht self, "invalid/main.c", self.line, 10099451b44SJordan Rupprecht num_expected_locations=0, loc_exact=True) 10199451b44SJordan Rupprecht lldbutil.run_break_set_by_file_and_line( 10299451b44SJordan Rupprecht self, "./invalid/main.c", self.line, 10399451b44SJordan Rupprecht num_expected_locations=0, loc_exact=True) 10499451b44SJordan Rupprecht # Now add callbacks for the breakpoints just created. 10599451b44SJordan Rupprecht self.runCmd( 10699451b44SJordan Rupprecht "breakpoint command add -s command -o 'frame variable --show-types --scope' 1 4") 10799451b44SJordan Rupprecht self.runCmd( 10899451b44SJordan Rupprecht "breakpoint command add -s python -o 'import side_effect; side_effect.one_liner = \"one liner was here\"' 2") 10999451b44SJordan Rupprecht 11099451b44SJordan Rupprecht import side_effect 11199451b44SJordan Rupprecht self.runCmd("command script import --allow-reload ./bktptcmd.py") 11299451b44SJordan Rupprecht 11399451b44SJordan Rupprecht self.runCmd( 11499451b44SJordan Rupprecht "breakpoint command add --python-function bktptcmd.function 3") 11599451b44SJordan Rupprecht 11699451b44SJordan Rupprecht # Check that the breakpoint commands are correctly set. 11799451b44SJordan Rupprecht 11899451b44SJordan Rupprecht # The breakpoint list now only contains breakpoint 1. 11999451b44SJordan Rupprecht self.expect( 12099451b44SJordan Rupprecht "breakpoint list", "Breakpoints 1 & 2 created", substrs=[ 12199451b44SJordan Rupprecht "2: file = 'main.c', line = %d, exact_match = 0, locations = 1" % 12299451b44SJordan Rupprecht self.line], patterns=[ 12399451b44SJordan Rupprecht "1: file = '.*main.c', line = %d, exact_match = 0, locations = 1" % 12499451b44SJordan Rupprecht self.line]) 12599451b44SJordan Rupprecht 12699451b44SJordan Rupprecht self.expect( 12799451b44SJordan Rupprecht "breakpoint list -f", 12899451b44SJordan Rupprecht "Breakpoints 1 & 2 created", 12999451b44SJordan Rupprecht substrs=[ 13099451b44SJordan Rupprecht "2: file = 'main.c', line = %d, exact_match = 0, locations = 1" % 13199451b44SJordan Rupprecht self.line], 13299451b44SJordan Rupprecht patterns=[ 13399451b44SJordan Rupprecht "1: file = '.*main.c', line = %d, exact_match = 0, locations = 1" % 13499451b44SJordan Rupprecht self.line, 13599451b44SJordan Rupprecht "1.1: .+at main.c:%d:?[0-9]*, .+unresolved, hit count = 0" % 13699451b44SJordan Rupprecht self.line, 13799451b44SJordan Rupprecht "2.1: .+at main.c:%d:?[0-9]*, .+unresolved, hit count = 0" % 13899451b44SJordan Rupprecht self.line]) 13999451b44SJordan Rupprecht 14099451b44SJordan Rupprecht self.expect("breakpoint command list 1", "Breakpoint 1 command ok", 14199451b44SJordan Rupprecht substrs=["Breakpoint commands:", 14299451b44SJordan Rupprecht "frame variable --show-types --scope"]) 14399451b44SJordan Rupprecht self.expect("breakpoint command list 2", "Breakpoint 2 command ok", 14499451b44SJordan Rupprecht substrs=["Breakpoint commands (Python):", 14599451b44SJordan Rupprecht "import side_effect", 14699451b44SJordan Rupprecht "side_effect.one_liner"]) 14799451b44SJordan Rupprecht self.expect("breakpoint command list 3", "Breakpoint 3 command ok", 14899451b44SJordan Rupprecht substrs=["Breakpoint commands (Python):", 14999451b44SJordan Rupprecht "bktptcmd.function(frame, bp_loc, internal_dict)"]) 15099451b44SJordan Rupprecht 15199451b44SJordan Rupprecht self.expect("breakpoint command list 4", "Breakpoint 4 command ok", 15299451b44SJordan Rupprecht substrs=["Breakpoint commands:", 15399451b44SJordan Rupprecht "frame variable --show-types --scope"]) 15499451b44SJordan Rupprecht 15599451b44SJordan Rupprecht self.runCmd("breakpoint delete 4") 15699451b44SJordan Rupprecht 15799451b44SJordan Rupprecht # Next lets try some other breakpoint kinds. First break with a regular expression 15899451b44SJordan Rupprecht # and then specify only one file. The first time we should get two locations, 15999451b44SJordan Rupprecht # the second time only one: 16099451b44SJordan Rupprecht 16199451b44SJordan Rupprecht lldbutil.run_break_set_by_regexp( 16299451b44SJordan Rupprecht self, r"._MyFunction", num_expected_locations=2) 16399451b44SJordan Rupprecht 16499451b44SJordan Rupprecht lldbutil.run_break_set_by_regexp( 16599451b44SJordan Rupprecht self, 16699451b44SJordan Rupprecht r"._MyFunction", 16799451b44SJordan Rupprecht extra_options="-f a.c", 16899451b44SJordan Rupprecht num_expected_locations=1) 16999451b44SJordan Rupprecht 17099451b44SJordan Rupprecht lldbutil.run_break_set_by_regexp( 17199451b44SJordan Rupprecht self, 17299451b44SJordan Rupprecht r"._MyFunction", 17399451b44SJordan Rupprecht extra_options="-f a.c -f b.c", 17499451b44SJordan Rupprecht num_expected_locations=2) 17599451b44SJordan Rupprecht 17699451b44SJordan Rupprecht # Now try a source regex breakpoint: 17799451b44SJordan Rupprecht lldbutil.run_break_set_by_source_regexp( 17899451b44SJordan Rupprecht self, 17999451b44SJordan Rupprecht r"is about to return [12]0", 18099451b44SJordan Rupprecht extra_options="-f a.c -f b.c", 18199451b44SJordan Rupprecht num_expected_locations=2) 18299451b44SJordan Rupprecht 18399451b44SJordan Rupprecht lldbutil.run_break_set_by_source_regexp( 18499451b44SJordan Rupprecht self, 18599451b44SJordan Rupprecht r"is about to return [12]0", 18699451b44SJordan Rupprecht extra_options="-f a.c", 18799451b44SJordan Rupprecht num_expected_locations=1) 18899451b44SJordan Rupprecht 18999451b44SJordan Rupprecht # Reset our canary variables and run the program. 19099451b44SJordan Rupprecht side_effect.one_liner = None 19199451b44SJordan Rupprecht side_effect.bktptcmd = None 19299451b44SJordan Rupprecht self.runCmd("run", RUN_SUCCEEDED) 19399451b44SJordan Rupprecht 19499451b44SJordan Rupprecht # Check the value of canary variables. 19599451b44SJordan Rupprecht self.assertEquals("one liner was here", side_effect.one_liner) 19699451b44SJordan Rupprecht self.assertEquals("function was here", side_effect.bktptcmd) 19799451b44SJordan Rupprecht 19899451b44SJordan Rupprecht # Finish the program. 19999451b44SJordan Rupprecht self.runCmd("process continue") 20099451b44SJordan Rupprecht 20199451b44SJordan Rupprecht # Remove the breakpoint command associated with breakpoint 1. 20299451b44SJordan Rupprecht self.runCmd("breakpoint command delete 1") 20399451b44SJordan Rupprecht 20499451b44SJordan Rupprecht # Remove breakpoint 2. 20599451b44SJordan Rupprecht self.runCmd("breakpoint delete 2") 20699451b44SJordan Rupprecht 20799451b44SJordan Rupprecht self.expect( 20899451b44SJordan Rupprecht "breakpoint command list 1", 20999451b44SJordan Rupprecht startstr="Breakpoint 1 does not have an associated command.") 21099451b44SJordan Rupprecht self.expect( 21199451b44SJordan Rupprecht "breakpoint command list 2", 21299451b44SJordan Rupprecht error=True, 21399451b44SJordan Rupprecht startstr="error: '2' is not a currently valid breakpoint ID.") 21499451b44SJordan Rupprecht 21599451b44SJordan Rupprecht # The breakpoint list now only contains breakpoint 1. 21699451b44SJordan Rupprecht self.expect( 21799451b44SJordan Rupprecht "breakpoint list -f", 21899451b44SJordan Rupprecht "Breakpoint 1 exists", 21999451b44SJordan Rupprecht patterns=[ 22099451b44SJordan Rupprecht "1: file = '.*main.c', line = %d, exact_match = 0, locations = 1, resolved = 1" % 22199451b44SJordan Rupprecht self.line, 22299451b44SJordan Rupprecht "hit count = 1"]) 22399451b44SJordan Rupprecht 22499451b44SJordan Rupprecht # Not breakpoint 2. 22599451b44SJordan Rupprecht self.expect( 22699451b44SJordan Rupprecht "breakpoint list -f", 22799451b44SJordan Rupprecht "No more breakpoint 2", 22899451b44SJordan Rupprecht matching=False, 22999451b44SJordan Rupprecht substrs=[ 23099451b44SJordan Rupprecht "2: file = 'main.c', line = %d, exact_match = 0, locations = 1, resolved = 1" % 23199451b44SJordan Rupprecht self.line]) 23299451b44SJordan Rupprecht 23399451b44SJordan Rupprecht # Run the program again, with breakpoint 1 remaining. 23499451b44SJordan Rupprecht self.runCmd("run", RUN_SUCCEEDED) 23599451b44SJordan Rupprecht 23699451b44SJordan Rupprecht # We should be stopped again due to breakpoint 1. 23799451b44SJordan Rupprecht 23899451b44SJordan Rupprecht # The stop reason of the thread should be breakpoint. 23999451b44SJordan Rupprecht self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT, 24099451b44SJordan Rupprecht substrs=['stopped', 24199451b44SJordan Rupprecht 'stop reason = breakpoint']) 24299451b44SJordan Rupprecht 24399451b44SJordan Rupprecht # The breakpoint should have a hit count of 2. 2449f0b5f9aSSYNOPSYS\georgiev lldbutil.check_breakpoint(self, bpno = 1, expected_hit_count = 2) 24599451b44SJordan Rupprecht 24699451b44SJordan Rupprecht def breakpoint_command_script_parameters(self): 24799451b44SJordan Rupprecht """Test that the frame and breakpoint location are being properly passed to the script breakpoint command function.""" 24899451b44SJordan Rupprecht exe = self.getBuildArtifact("a.out") 24999451b44SJordan Rupprecht self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET) 25099451b44SJordan Rupprecht 25199451b44SJordan Rupprecht # Add a breakpoint. 25299451b44SJordan Rupprecht lldbutil.run_break_set_by_file_and_line( 25399451b44SJordan Rupprecht self, "main.c", self.line, num_expected_locations=1, loc_exact=True) 25499451b44SJordan Rupprecht 25599451b44SJordan Rupprecht # Now add callbacks for the breakpoints just created. 25699451b44SJordan Rupprecht self.runCmd("breakpoint command add -s python -o 'import side_effect; side_effect.frame = str(frame); side_effect.bp_loc = str(bp_loc)' 1") 25799451b44SJordan Rupprecht 25899451b44SJordan Rupprecht # Reset canary variables and run. 25999451b44SJordan Rupprecht side_effect.frame = None 26099451b44SJordan Rupprecht side_effect.bp_loc = None 26199451b44SJordan Rupprecht self.runCmd("run", RUN_SUCCEEDED) 26299451b44SJordan Rupprecht 26399451b44SJordan Rupprecht self.expect(side_effect.frame, exe=False, startstr="frame #0:") 26499451b44SJordan Rupprecht self.expect(side_effect.bp_loc, exe=False, 2659f0b5f9aSSYNOPSYS\georgiev patterns=["1.* where = .*main .* resolved,( hardware,)? hit count = 1"]) 26699451b44SJordan Rupprecht 26799451b44SJordan Rupprecht def breakpoint_commands_on_creation(self): 26899451b44SJordan Rupprecht """Test that setting breakpoint commands when creating the breakpoint works""" 26954c26872SRaphael Isemann target = self.createTestTarget() 27099451b44SJordan Rupprecht 27199451b44SJordan Rupprecht # Add a breakpoint. 27299451b44SJordan Rupprecht lldbutil.run_break_set_by_file_and_line( 27399451b44SJordan Rupprecht self, "main.c", self.line, num_expected_locations=1, loc_exact=True, 27499451b44SJordan Rupprecht extra_options='-C bt -C "thread list" -C continue') 27599451b44SJordan Rupprecht 27699451b44SJordan Rupprecht bkpt = target.FindBreakpointByID(1) 27799451b44SJordan Rupprecht self.assertTrue(bkpt.IsValid(), "Couldn't find breakpoint 1") 27899451b44SJordan Rupprecht com_list = lldb.SBStringList() 27999451b44SJordan Rupprecht bkpt.GetCommandLineCommands(com_list) 28099451b44SJordan Rupprecht self.assertEqual(com_list.GetSize(), 3, "Got the wrong number of commands") 28199451b44SJordan Rupprecht self.assertEqual(com_list.GetStringAtIndex(0), "bt", "First bt") 28299451b44SJordan Rupprecht self.assertEqual(com_list.GetStringAtIndex(1), "thread list", "Next thread list") 28399451b44SJordan Rupprecht self.assertEqual(com_list.GetStringAtIndex(2), "continue", "Last continue") 2843726ac41SJim Ingham 285*d92f7f79SJim Ingham def test_add_commands_by_breakpoint_name(self): 286*d92f7f79SJim Ingham """Make sure that when you specify a breakpoint name to "break command add" 287*d92f7f79SJim Ingham it gets added to all the breakpoints marked with that name.""" 288*d92f7f79SJim Ingham self.build() 289*d92f7f79SJim Ingham target = self.createTestTarget() 290*d92f7f79SJim Ingham 291*d92f7f79SJim Ingham bp_ids = [] 292*d92f7f79SJim Ingham bp_names = ["main", "not_here", "main"] 293*d92f7f79SJim Ingham for bp_name in bp_names: 294*d92f7f79SJim Ingham bp = target.BreakpointCreateByName(bp_name) 295*d92f7f79SJim Ingham bp.AddName("MyBKPTS") 296*d92f7f79SJim Ingham bp_ids.append(bp.GetID()) 297*d92f7f79SJim Ingham # First do it with a script one-liner: 298*d92f7f79SJim Ingham self.runCmd("breakpoint command add -s py -o 'print(\"some command\")' MyBKPTS") 299*d92f7f79SJim Ingham for id in bp_ids: 300*d92f7f79SJim Ingham self.expect("breakpoint command list {0}".format(id), 301*d92f7f79SJim Ingham patterns=["some command"]) 302*d92f7f79SJim Ingham # Now do the same thing with a python function: 303*d92f7f79SJim Ingham import side_effect 304*d92f7f79SJim Ingham self.runCmd("command script import --allow-reload ./bktptcmd.py") 305*d92f7f79SJim Ingham 306*d92f7f79SJim Ingham self.runCmd("breakpoint command add --python-function bktptcmd.function MyBKPTS") 307*d92f7f79SJim Ingham for id in bp_ids: 308*d92f7f79SJim Ingham self.expect("breakpoint command list {0}".format(id), 309*d92f7f79SJim Ingham patterns=["bktptcmd.function"]) 310*d92f7f79SJim Ingham 311*d92f7f79SJim Ingham 312*d92f7f79SJim Ingham 3133726ac41SJim Ingham def test_breakpoint_delete_disabled(self): 3143726ac41SJim Ingham """Test 'break delete --disabled' works""" 3153726ac41SJim Ingham self.build() 31654c26872SRaphael Isemann target = self.createTestTarget() 3173726ac41SJim Ingham 3183726ac41SJim Ingham bp_1 = target.BreakpointCreateByName("main") 3193726ac41SJim Ingham bp_2 = target.BreakpointCreateByName("not_here") 3203726ac41SJim Ingham bp_3 = target.BreakpointCreateByName("main") 3213726ac41SJim Ingham bp_3.AddName("DeleteMeNot") 3223726ac41SJim Ingham 3233726ac41SJim Ingham bp_1.SetEnabled(False) 3243726ac41SJim Ingham bp_3.SetEnabled(False) 3253726ac41SJim Ingham 3263726ac41SJim Ingham bp_id_1 = bp_1.GetID() 3273726ac41SJim Ingham bp_id_2 = bp_2.GetID() 3283726ac41SJim Ingham bp_id_3 = bp_3.GetID() 3293726ac41SJim Ingham 3303726ac41SJim Ingham self.runCmd("breakpoint delete --disabled DeleteMeNot") 3313726ac41SJim Ingham 3323726ac41SJim Ingham bp_1 = target.FindBreakpointByID(bp_id_1) 3333726ac41SJim Ingham self.assertFalse(bp_1.IsValid(), "Didn't delete disabled breakpoint 1") 3343726ac41SJim Ingham 3353726ac41SJim Ingham bp_2 = target.FindBreakpointByID(bp_id_2) 3363726ac41SJim Ingham self.assertTrue(bp_2.IsValid(), "Deleted enabled breakpoint 2") 3373726ac41SJim Ingham 3383726ac41SJim Ingham bp_3 = target.FindBreakpointByID(bp_id_3) 3393726ac41SJim Ingham self.assertTrue(bp_3.IsValid(), "DeleteMeNot didn't protect disabled breakpoint 3") 3400018c712SJim Ingham 3410018c712SJim Ingham # Reset the first breakpoint, disable it, and do this again with no protected name: 3420018c712SJim Ingham bp_1 = target.BreakpointCreateByName("main") 3430018c712SJim Ingham 3440018c712SJim Ingham bp_1.SetEnabled(False) 3450018c712SJim Ingham 3460018c712SJim Ingham bp_id_1 = bp_1.GetID() 3470018c712SJim Ingham 3480018c712SJim Ingham self.runCmd("breakpoint delete --disabled") 3490018c712SJim Ingham 3500018c712SJim Ingham bp_1 = target.FindBreakpointByID(bp_id_1) 3510018c712SJim Ingham self.assertFalse(bp_1.IsValid(), "Didn't delete disabled breakpoint 1") 3520018c712SJim Ingham 3530018c712SJim Ingham bp_2 = target.FindBreakpointByID(bp_id_2) 3540018c712SJim Ingham self.assertTrue(bp_2.IsValid(), "Deleted enabled breakpoint 2") 3550018c712SJim Ingham 3560018c712SJim Ingham bp_3 = target.FindBreakpointByID(bp_id_3) 3570018c712SJim Ingham self.assertFalse(bp_3.IsValid(), "Didn't delete disabled breakpoint 3") 358