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 def test_lldb_iter_frame(self): 93 """Test iterator works correctly for SBProcess->SBThread->SBFrame.""" 94 self.build() 95 exe = self.getBuildArtifact("a.out") 96 97 target = self.dbg.CreateTarget(exe) 98 self.assertTrue(target, VALID_TARGET) 99 100 breakpoint = target.BreakpointCreateByLocation("main.cpp", self.line1) 101 self.assertTrue(breakpoint, VALID_BREAKPOINT) 102 103 # Now launch the process, and do not stop at entry point. 104 process = target.LaunchSimple( 105 None, None, self.get_process_working_directory()) 106 107 if not process: 108 self.fail("SBTarget.LaunchProcess() failed") 109 110 from lldbsuite.test.lldbutil import print_stacktrace 111 stopped_due_to_breakpoint = False 112 for thread in process: 113 if self.TraceOn(): 114 print_stacktrace(thread) 115 ID = thread.GetThreadID() 116 if thread.GetStopReason() == lldb.eStopReasonBreakpoint: 117 stopped_due_to_breakpoint = True 118 for frame in thread: 119 self.assertEqual(frame.GetThread().GetThreadID(), ID) 120 if self.TraceOn(): 121 print(frame) 122 123 self.assertTrue(stopped_due_to_breakpoint) 124