TestRegistersIterator.py revision 6bc4dcdfbcdfa455299d2123011b82a77351ee72
1"""
2Test the iteration protocol for frame registers.
3"""
4
5import os, time
6import re
7import unittest2
8import lldb
9from lldbtest import *
10
11class RegistersIteratorTestCase(TestBase):
12
13    mydir = os.path.join("python_api", "lldbutil", "iter")
14
15    def setUp(self):
16        # Call super's setUp().
17        TestBase.setUp(self)
18        # Find the line number to break inside main().
19        self.line1 = line_number('main.cpp', '// Set break point at this line.')
20
21    @expectedFailureLinux # llvm.org/pr14600 - Exception state registers not supported on Linux
22    @python_api_test
23    def test_iter_registers(self):
24        """Test iterator works correctly for lldbutil.iter_registers()."""
25        self.buildDefault()
26        self.iter_registers()
27
28    def iter_registers(self):
29        exe = os.path.join(os.getcwd(), "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(None, None, os.getcwd())
39
40        if not process:
41            self.fail("SBTarget.LaunchProcess() failed")
42
43        import lldbutil
44        for thread in process:
45            if thread.GetStopReason() == lldb.eStopReasonBreakpoint:
46                for frame in thread:
47                    # Dump the registers of this frame using lldbutil.get_GPRs() and friends.
48                    if self.TraceOn():
49                        print frame
50
51                    REGs = lldbutil.get_GPRs(frame)
52                    num = len(REGs)
53                    if self.TraceOn():
54                        print "\nNumber of general purpose registers: %d" % num
55                    for reg in REGs:
56                        self.assertTrue(reg)
57                        if self.TraceOn():
58                            print "%s => %s" % (reg.GetName(), reg.GetValue())
59
60                    REGs = lldbutil.get_FPRs(frame)
61                    num = len(REGs)
62                    if self.TraceOn():
63                        print "\nNumber of floating point registers: %d" % num
64                    for reg in REGs:
65                        self.assertTrue(reg)
66                        if self.TraceOn():
67                            print "%s => %s" % (reg.GetName(), reg.GetValue())
68
69                    REGs = lldbutil.get_ESRs(frame)
70                    num = len(REGs)
71                    if self.TraceOn():
72                        print "\nNumber of exception state registers: %d" % num
73                    for reg in REGs:
74                        self.assertTrue(reg)
75                        if self.TraceOn():
76                            print "%s => %s" % (reg.GetName(), reg.GetValue())
77
78                    # And these should also work.
79                    for kind in ["General Purpose Registers",
80                                 "Floating Point Registers",
81                                 "Exception State Registers"]:
82                        REGs = lldbutil.get_registers(frame, kind)
83                        self.assertTrue(REGs)
84
85                    # We've finished dumping the registers for frame #0.
86                    break
87
88
89if __name__ == '__main__':
90    import atexit
91    lldb.SBDebugger.Initialize()
92    atexit.register(lambda: lldb.SBDebugger.Terminate())
93    unittest2.main()
94