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