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