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