"""
Test the 'register' command.
"""
import os, time
import re
import unittest2
import lldb
from lldbtest import *
import lldbutil
class RegisterCommandsTestCase(TestBase):
mydir = os.path.join("functionalities", "register")
def test_register_commands(self):
"""Test commands related to registers, in particular xmm registers."""
if not self.getArchitecture() in ['i386', 'x86_64']:
self.skipTest("This test requires i386 or x86_64 as the architecture for the inferior")
self.buildDefault()
self.register_commands()
def test_convenience_registers(self):
"""Test convenience registers."""
if not self.getArchitecture() in ['x86_64']:
self.skipTest("This test requires x86_64 as the architecture for the inferior")
self.buildDefault()
self.convenience_registers()
def test_convenience_registers_with_process_attach(self):
"""Test convenience registers after a 'process attach'."""
if not self.getArchitecture() in ['x86_64']:
self.skipTest("This test requires x86_64 as the architecture for the inferior")
self.buildDefault()
self.convenience_registers_with_process_attach()
def register_commands(self):
"""Test commands related to registers, in particular xmm registers."""
exe = os.path.join(os.getcwd(), "a.out")
self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
lldbutil.run_break_set_by_symbol (self, "main", num_expected_locations=-1)
self.runCmd("run", RUN_SUCCEEDED)
self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
substrs = ['stopped', 'stop reason = breakpoint'])
self.expect("register read -a", MISSING_EXPECTED_REGISTERS,
substrs = ['registers were unavailable'], matching = False)
self.runCmd("register read xmm0")
self.expect("expr $xmm0",
substrs = ['vector_type'])
self.expect("expr (unsigned int)$xmm0[0]",
substrs = ['unsigned int'])
def convenience_registers(self):
"""Test convenience registers."""
exe = os.path.join(os.getcwd(), "a.out")
self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
lldbutil.run_break_set_by_symbol (self, "main", num_expected_locations=-1)
self.runCmd("run", RUN_SUCCEEDED)
self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
substrs = ['stopped', 'stop reason = breakpoint'])
self.expect("register read", matching=False,
substrs = ['eax'])
self.expect("register read -a", matching=True,
substrs = ['eax'])
self.runCmd("register read rax eax")
self.runCmd("register write rax 0x1234567887654321")
self.expect("expr -- ($rax & 0xffffffff) == $eax",
substrs = ['true'])
self.expect("expr -- $ax == (($ah << 8) | $al)",
substrs = ['true'])
def convenience_registers_with_process_attach(self):
"""Test convenience registers after a 'process attach'."""
exe = self.lldbHere
import subprocess
popen = subprocess.Popen([exe, self.lldbOption],
stdout = open(os.devnull, 'w') if not self.TraceOn() else None)
if self.TraceOn():
print "pid of spawned process: %d" % popen.pid
self.runCmd("process attach -p %d" % popen.pid)
self.addTearDownHook(
lambda: popen.kill())
self.runCmd("register read eax")
if __name__ == '__main__':
import atexit
lldb.SBDebugger.Initialize()
atexit.register(lambda: lldb.SBDebugger.Terminate())
unittest2.main()