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 13a9f92b15f939ae4c4d17c2a61e03477a73955b42Johnny Chen mydir = os.path.join("python_api", "lldbutil", "iter") 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 218be36596a02e57eb3b187f03a760c532d6d95571Ed Maste @expectedFailureFreeBSD # llvm.org/pr14600 - Exception state registers not supported on FreeBSD 226bc4dcdfbcdfa455299d2123011b82a77351ee72Daniel Malea @expectedFailureLinux # llvm.org/pr14600 - Exception state registers not supported on Linux 2382ccf4033d09dc7002637ddc70a3ffcc518a58c9Johnny Chen @python_api_test 24728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen def test_iter_registers(self): 25728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen """Test iterator works correctly for lldbutil.iter_registers().""" 26728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen self.buildDefault() 27728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen self.iter_registers() 28728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen 29728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen def iter_registers(self): 30728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen exe = os.path.join(os.getcwd(), "a.out") 31728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen 32728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen target = self.dbg.CreateTarget(exe) 332077f0d1ea42e1941387b101e61db01a73d5ee08Johnny Chen self.assertTrue(target, VALID_TARGET) 34728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen 35728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen breakpoint = target.BreakpointCreateByLocation("main.cpp", self.line1) 362077f0d1ea42e1941387b101e61db01a73d5ee08Johnny Chen self.assertTrue(breakpoint, VALID_BREAKPOINT) 37728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen 38728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen # Now launch the process, and do not stop at entry point. 39425b0cf93f509ba63346e56654322b9d9bc91d60Johnny Chen process = target.LaunchSimple(None, None, os.getcwd()) 40728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen 41425b0cf93f509ba63346e56654322b9d9bc91d60Johnny Chen if not process: 42728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen self.fail("SBTarget.LaunchProcess() failed") 43728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen 44728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen import lldbutil 453d8ae4681b81b42a404ad77a231c6f743040e644Johnny Chen for thread in process: 46728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen if thread.GetStopReason() == lldb.eStopReasonBreakpoint: 47728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen for frame in thread: 48a79a21c64268ccadb34cbb1084fb70849034afddJohnny Chen # Dump the registers of this frame using lldbutil.get_GPRs() and friends. 49728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen if self.TraceOn(): 50728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen print frame 51728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen 52a79a21c64268ccadb34cbb1084fb70849034afddJohnny Chen REGs = lldbutil.get_GPRs(frame) 53a79a21c64268ccadb34cbb1084fb70849034afddJohnny Chen num = len(REGs) 54a79a21c64268ccadb34cbb1084fb70849034afddJohnny Chen if self.TraceOn(): 55a79a21c64268ccadb34cbb1084fb70849034afddJohnny Chen print "\nNumber of general purpose registers: %d" % num 56a79a21c64268ccadb34cbb1084fb70849034afddJohnny Chen for reg in REGs: 572077f0d1ea42e1941387b101e61db01a73d5ee08Johnny Chen self.assertTrue(reg) 58a79a21c64268ccadb34cbb1084fb70849034afddJohnny Chen if self.TraceOn(): 590fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton print "%s => %s" % (reg.GetName(), reg.GetValue()) 60a79a21c64268ccadb34cbb1084fb70849034afddJohnny Chen 61a79a21c64268ccadb34cbb1084fb70849034afddJohnny Chen REGs = lldbutil.get_FPRs(frame) 62a79a21c64268ccadb34cbb1084fb70849034afddJohnny Chen num = len(REGs) 63a79a21c64268ccadb34cbb1084fb70849034afddJohnny Chen if self.TraceOn(): 64a79a21c64268ccadb34cbb1084fb70849034afddJohnny Chen print "\nNumber of floating point registers: %d" % num 65a79a21c64268ccadb34cbb1084fb70849034afddJohnny Chen for reg in REGs: 662077f0d1ea42e1941387b101e61db01a73d5ee08Johnny Chen self.assertTrue(reg) 67a79a21c64268ccadb34cbb1084fb70849034afddJohnny Chen if self.TraceOn(): 680fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton print "%s => %s" % (reg.GetName(), reg.GetValue()) 69a79a21c64268ccadb34cbb1084fb70849034afddJohnny Chen 70a79a21c64268ccadb34cbb1084fb70849034afddJohnny Chen REGs = lldbutil.get_ESRs(frame) 71a79a21c64268ccadb34cbb1084fb70849034afddJohnny Chen num = len(REGs) 72a79a21c64268ccadb34cbb1084fb70849034afddJohnny Chen if self.TraceOn(): 73a79a21c64268ccadb34cbb1084fb70849034afddJohnny Chen print "\nNumber of exception state registers: %d" % num 74a79a21c64268ccadb34cbb1084fb70849034afddJohnny Chen for reg in REGs: 752077f0d1ea42e1941387b101e61db01a73d5ee08Johnny Chen self.assertTrue(reg) 76a79a21c64268ccadb34cbb1084fb70849034afddJohnny Chen if self.TraceOn(): 770fb0bcc9d4e951145e1b8c783652224c09b23af4Greg Clayton print "%s => %s" % (reg.GetName(), reg.GetValue()) 78a79a21c64268ccadb34cbb1084fb70849034afddJohnny Chen 79a79a21c64268ccadb34cbb1084fb70849034afddJohnny Chen # And these should also work. 80728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen for kind in ["General Purpose Registers", 81728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen "Floating Point Registers", 82728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen "Exception State Registers"]: 83728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen REGs = lldbutil.get_registers(frame, kind) 842077f0d1ea42e1941387b101e61db01a73d5ee08Johnny Chen self.assertTrue(REGs) 85728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen 86a79a21c64268ccadb34cbb1084fb70849034afddJohnny Chen # We've finished dumping the registers for frame #0. 87728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen break 88728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen 89728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen 90728255bc323e93a36644a4cdf225192c34c8472cJohnny Chenif __name__ == '__main__': 91728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen import atexit 92728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen lldb.SBDebugger.Initialize() 93728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen atexit.register(lambda: lldb.SBDebugger.Terminate()) 94728255bc323e93a36644a4cdf225192c34c8472cJohnny Chen unittest2.main() 95