1""" 2Test the iteration protocol for some lldb container objects. 3""" 4 5from __future__ import print_function 6 7 8import lldb 9from lldbsuite.test.decorators import * 10from lldbsuite.test.lldbtest import * 11from lldbsuite.test import lldbutil 12 13 14class LLDBIteratorTestCase(TestBase): 15 16 mydir = TestBase.compute_mydir(__file__) 17 18 def setUp(self): 19 # Call super's setUp(). 20 TestBase.setUp(self) 21 # Find the line numbers to break inside main(). 22 self.line1 = line_number( 23 'main.cpp', '// Set break point at this line.') 24 self.line2 = line_number('main.cpp', '// And that line.') 25 26 def test_lldb_iter_module(self): 27 """Test module_iter works correctly for SBTarget -> SBModule.""" 28 self.build() 29 exe = self.getBuildArtifact("a.out") 30 31 target = self.dbg.CreateTarget(exe) 32 self.assertTrue(target, VALID_TARGET) 33 34 breakpoint = target.BreakpointCreateByLocation("main.cpp", self.line1) 35 self.assertTrue(breakpoint, VALID_BREAKPOINT) 36 37 # Now launch the process, and do not stop at entry point. 38 process = target.LaunchSimple( 39 None, None, self.get_process_working_directory()) 40 41 if not process: 42 self.fail("SBTarget.LaunchProcess() failed") 43 44 from lldbsuite.test.lldbutil import get_description 45 yours = [] 46 for i in range(target.GetNumModules()): 47 yours.append(target.GetModuleAtIndex(i)) 48 mine = [] 49 for m in target.module_iter(): 50 mine.append(m) 51 52 self.assertEqual(len(yours), len(mine)) 53 for i in range(len(yours)): 54 if self.TraceOn(): 55 print("yours[%d]='%s'" % (i, get_description(yours[i]))) 56 print("mine[%d]='%s'" % (i, get_description(mine[i]))) 57 self.assertEqual( 58 yours[i], mine[i], 59 "UUID+FileSpec of yours[{0}] and mine[{0}] matches".format(i)) 60 61 def test_lldb_iter_breakpoint(self): 62 """Test breakpoint_iter works correctly for SBTarget -> SBBreakpoint.""" 63 self.build() 64 exe = self.getBuildArtifact("a.out") 65 66 target = self.dbg.CreateTarget(exe) 67 self.assertTrue(target, VALID_TARGET) 68 69 breakpoint = target.BreakpointCreateByLocation("main.cpp", self.line1) 70 self.assertTrue(breakpoint, VALID_BREAKPOINT) 71 breakpoint = target.BreakpointCreateByLocation("main.cpp", self.line2) 72 self.assertTrue(breakpoint, VALID_BREAKPOINT) 73 74 self.assertEqual(target.GetNumBreakpoints(), 2) 75 76 from lldbsuite.test.lldbutil import get_description 77 yours = [] 78 for i in range(target.GetNumBreakpoints()): 79 yours.append(target.GetBreakpointAtIndex(i)) 80 mine = [] 81 for b in target.breakpoint_iter(): 82 mine.append(b) 83 84 self.assertEqual(len(yours), len(mine)) 85 for i in range(len(yours)): 86 if self.TraceOn(): 87 print("yours[%d]='%s'" % (i, get_description(yours[i]))) 88 print("mine[%d]='%s'" % (i, get_description(mine[i]))) 89 self.assertEqual(yours[i], mine[i], 90 "ID of yours[{0}] and mine[{0}] matches".format(i)) 91 92 @skipIfWindows # This test is flaky on Windows 93 def test_lldb_iter_frame(self): 94 """Test iterator works correctly for SBProcess->SBThread->SBFrame.""" 95 self.build() 96 exe = self.getBuildArtifact("a.out") 97 98 target = self.dbg.CreateTarget(exe) 99 self.assertTrue(target, VALID_TARGET) 100 101 breakpoint = target.BreakpointCreateByLocation("main.cpp", self.line1) 102 self.assertTrue(breakpoint, VALID_BREAKPOINT) 103 104 # Now launch the process, and do not stop at entry point. 105 process = target.LaunchSimple( 106 None, None, self.get_process_working_directory()) 107 108 if not process: 109 self.fail("SBTarget.LaunchProcess() failed") 110 111 from lldbsuite.test.lldbutil import print_stacktrace 112 stopped_due_to_breakpoint = False 113 for thread in process: 114 if self.TraceOn(): 115 print_stacktrace(thread) 116 ID = thread.GetThreadID() 117 if thread.GetStopReason() == lldb.eStopReasonBreakpoint: 118 stopped_due_to_breakpoint = True 119 for frame in thread: 120 self.assertEqual(frame.GetThread().GetThreadID(), ID) 121 if self.TraceOn(): 122 print(frame) 123 124 self.assertTrue(stopped_due_to_breakpoint) 125