TestRegistersIterator.py revision 728255bc323e93a36644a4cdf225192c34c8472c
1728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen"""
2728255bc323e93a36644a4cdf225192c34c8472cJohnny ChenTest the iteration protocol for frame registers.
3728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen"""
4728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen
5728255bc323e93a36644a4cdf225192c34c8472cJohnny Chenimport os, time
6728255bc323e93a36644a4cdf225192c34c8472cJohnny Chenimport re
7728255bc323e93a36644a4cdf225192c34c8472cJohnny Chenimport unittest2
8728255bc323e93a36644a4cdf225192c34c8472cJohnny Chenimport lldb
9728255bc323e93a36644a4cdf225192c34c8472cJohnny Chenfrom lldbtest import *
10728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen
11728255bc323e93a36644a4cdf225192c34c8472cJohnny Chenclass RegistersIteratorTestCase(TestBase):
12728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen
13728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen    mydir = "python_api/lldbutil"
14728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen
15728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen    def setUp(self):
16728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen        # Call super's setUp().
17728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen        TestBase.setUp(self)
18728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen        # Find the line number to break inside main().
19728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen        self.line1 = line_number('main.cpp', '// Set break point at this line.')
20728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen
21728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen    def test_iter_registers(self):
22728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen        """Test iterator works correctly for lldbutil.iter_registers()."""
23728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen        self.buildDefault()
24728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen        self.iter_registers()
25728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen
26728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen    def iter_registers(self):
27728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen        exe = os.path.join(os.getcwd(), "a.out")
28728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen
29728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen        target = self.dbg.CreateTarget(exe)
30728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen        self.assertTrue(target.IsValid(), VALID_TARGET)
31728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen
32728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen        breakpoint = target.BreakpointCreateByLocation("main.cpp", self.line1)
33728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen        self.assertTrue(breakpoint.IsValid(), VALID_BREAKPOINT)
34728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen
35728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen        # Now launch the process, and do not stop at entry point.
36728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen        rc = lldb.SBError()
37728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen        self.process = target.Launch (self.dbg.GetListener(), None, None, os.ctermid(), os.ctermid(), os.ctermid(), None, 0, False, rc)
38728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen
39728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen        if not rc.Success() or not self.process.IsValid():
40728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen            self.fail("SBTarget.LaunchProcess() failed")
41728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen
42728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen        import lldbutil
43728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen        for thread in self.process:
44728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen            if thread.GetStopReason() == lldb.eStopReasonBreakpoint:
45728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen                for frame in thread:
46728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen                    # Dump the registers of this frame using iter_registers().
47728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen                    if self.TraceOn():
48728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen                        print frame
49728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen
50728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen                    for kind in ["General Purpose Registers",
51728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen                                 "Floating Point Registers",
52728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen                                 "Exception State Registers"]:
53728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen                        REGs = lldbutil.get_registers(frame, kind)
54728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen                        if self.TraceOn():
55728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen                            print "%s:" % kind
56728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen                        for reg in REGs:
57728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen                            self.assertTrue(reg.IsValid())
58728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen                            if self.TraceOn():
59728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen                                print "%s => %s" % (reg.GetName(), reg.GetValue(frame))
60728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen
61728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen                    # And these should also work.
62728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen                    self.assertTrue(lldbutil.get_GPRs(frame))
63728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen                    self.assertTrue(lldbutil.get_FPRs(frame))
64728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen                    self.assertTrue(lldbutil.get_ESRs(frame))
65728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen                    break
66728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen
67728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen
68728255bc323e93a36644a4cdf225192c34c8472cJohnny Chenif __name__ == '__main__':
69728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen    import atexit
70728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen    lldb.SBDebugger.Initialize()
71728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen    atexit.register(lambda: lldb.SBDebugger.Terminate())
72728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen    unittest2.main()
73