def iter_registers(self): exe = os.path.join(os.getcwd(), "a.out") target = self.dbg.CreateTarget(exe) self.assertTrue(target, VALID_TARGET) breakpoint = target.BreakpointCreateByLocation("main.cpp", self.line1) self.assertTrue(breakpoint, VALID_BREAKPOINT) # Now launch the process, and do not stop at entry point. process = target.LaunchSimple(None, None, os.getcwd()) if not process: self.fail("SBTarget.LaunchProcess() failed") import lldbutil for thread in process: if thread.GetStopReason() == lldb.eStopReasonBreakpoint: for frame in thread: # Dump the registers of this frame using lldbutil.get_GPRs() and friends. if self.TraceOn(): print frame REGs = lldbutil.get_GPRs(frame) num = len(REGs) if self.TraceOn(): print "\nNumber of general purpose registers: %d" % num for reg in REGs: self.assertTrue(reg) if self.TraceOn(): print "%s => %s" % (reg.GetName(), reg.GetValue()) REGs = lldbutil.get_FPRs(frame) num = len(REGs) if self.TraceOn(): print "\nNumber of floating point registers: %d" % num for reg in REGs: self.assertTrue(reg) if self.TraceOn(): print "%s => %s" % (reg.GetName(), reg.GetValue()) REGs = lldbutil.get_ESRs(frame) num = len(REGs) if self.TraceOn(): print "\nNumber of exception state registers: %d" % num for reg in REGs: self.assertTrue(reg) if self.TraceOn(): print "%s => %s" % (reg.GetName(), reg.GetValue()) # And these should also work. for kind in ["General Purpose Registers", "Floating Point Registers", "Exception State Registers"]: REGs = lldbutil.get_registers(frame, kind) self.assertTrue(REGs) # We've finished dumping the registers for frame #0. break
def do_get_arg_vals(self): """Get argument vals for the call stack when stopped on a breakpoint.""" exe = os.path.join(os.getcwd(), "a.out") # Create a target by the debugger. target = self.dbg.CreateTarget(exe) self.assertTrue(target, VALID_TARGET) # Now create a breakpoint on main.c by name 'c'. breakpoint = target.BreakpointCreateByName('c', 'a.out') #print "breakpoint:", breakpoint self.assertTrue(breakpoint and breakpoint.GetNumLocations() == 1, VALID_BREAKPOINT) # Now launch the process, and do not stop at the entry point. process = target.LaunchSimple(None, None, os.getcwd()) process = target.GetProcess() self.assertTrue(process.GetState() == lldb.eStateStopped, PROCESS_STOPPED) # Keeps track of the number of times 'a' is called where it is within a # depth of 3 of the 'c' leaf function. callsOfA = 0 import StringIO session = StringIO.StringIO() while process.GetState() == lldb.eStateStopped: thread = process.GetThreadAtIndex(0) # Inspect at most 3 frames. numFrames = min(3, thread.GetNumFrames()) for i in range(numFrames): frame = thread.GetFrameAtIndex(i) if self.TraceOn(): print "frame:", frame name = frame.GetFunction().GetName() if name == 'a': callsOfA = callsOfA + 1 # We'll inspect only the arguments for the current frame: # # arguments => True # locals => False # statics => False # in_scope_only => True valList = frame.GetVariables(True, False, False, True) argList = [] for val in valList: argList.append("(%s)%s=%s" % (val.GetTypeName(), val.GetName(), val.GetValue())) print >> session, "%s(%s)" % (name, ", ".join(argList)) # Also check the generic pc & stack pointer. We can't test their absolute values, # but they should be valid. Uses get_GPRs() from the lldbutil module. gpr_reg_set = lldbutil.get_GPRs(frame) pc_value = gpr_reg_set.GetChildMemberWithName("pc") self.assertTrue (pc_value, "We should have a valid PC.") self.assertTrue (int(pc_value.GetValue(), 0) == frame.GetPC(), "PC gotten as a value should equal frame's GetPC") sp_value = gpr_reg_set.GetChildMemberWithName("sp") self.assertTrue (sp_value, "We should have a valid Stack Pointer.") self.assertTrue (int(sp_value.GetValue(), 0) == frame.GetSP(), "SP gotten as a value should equal frame's GetSP") print >> session, "---" process.Continue() # At this point, the inferior process should have exited. self.assertTrue(process.GetState() == lldb.eStateExited, PROCESS_EXITED) # Expect to find 'a' on the call stacks two times. self.assertTrue(callsOfA == 2, "Expect to find 'a' on the call stacks two times") # By design, the 'a' call frame has the following arg vals: # o a((int)val=1, (char)ch='A') # o a((int)val=3, (char)ch='A') if self.TraceOn(): print "Full stack traces when stopped on the breakpoint 'c':" print session.getvalue() self.expect(session.getvalue(), "Argugment values displayed correctly", exe=False, substrs = ["a((int)val=1, (char)ch='A')", "a((int)val=3, (char)ch='A')"])
def do_get_arg_vals(self): """Get argument vals for the call stack when stopped on a breakpoint.""" exe = os.path.join(os.getcwd(), "a.out") # Create a target by the debugger. target = self.dbg.CreateTarget(exe) self.assertTrue(target, VALID_TARGET) # Now create a breakpoint on main.c by name 'c'. breakpoint = target.BreakpointCreateByName('c', 'a.out') #print "breakpoint:", breakpoint self.assertTrue(breakpoint and breakpoint.GetNumLocations() == 1, VALID_BREAKPOINT) # Now launch the process, and do not stop at the entry point. process = target.LaunchSimple(None, None, self.get_process_working_directory()) process = target.GetProcess() self.assertTrue(process.GetState() == lldb.eStateStopped, PROCESS_STOPPED) # Keeps track of the number of times 'a' is called where it is within a # depth of 3 of the 'c' leaf function. callsOfA = 0 import StringIO session = StringIO.StringIO() while process.GetState() == lldb.eStateStopped: thread = process.GetThreadAtIndex(0) # Inspect at most 3 frames. numFrames = min(3, thread.GetNumFrames()) for i in range(numFrames): frame = thread.GetFrameAtIndex(i) if self.TraceOn(): print "frame:", frame name = frame.GetFunction().GetName() if name == 'a': callsOfA = callsOfA + 1 # We'll inspect only the arguments for the current frame: # # arguments => True # locals => False # statics => False # in_scope_only => True valList = frame.GetVariables(True, False, False, True) argList = [] for val in valList: argList.append( "(%s)%s=%s" % (val.GetTypeName(), val.GetName(), val.GetValue())) print >> session, "%s(%s)" % (name, ", ".join(argList)) # Also check the generic pc & stack pointer. We can't test their absolute values, # but they should be valid. Uses get_GPRs() from the lldbutil module. gpr_reg_set = lldbutil.get_GPRs(frame) pc_value = gpr_reg_set.GetChildMemberWithName("pc") self.assertTrue(pc_value, "We should have a valid PC.") pc_value_str = pc_value.GetValue() self.assertTrue(pc_value_str, "We should have a valid PC string.") self.assertTrue( int(pc_value_str, 0) == frame.GetPC(), "PC gotten as a value should equal frame's GetPC") sp_value = gpr_reg_set.GetChildMemberWithName("sp") self.assertTrue(sp_value, "We should have a valid Stack Pointer.") self.assertTrue( int(sp_value.GetValue(), 0) == frame.GetSP(), "SP gotten as a value should equal frame's GetSP") print >> session, "---" process.Continue() # At this point, the inferior process should have exited. self.assertTrue(process.GetState() == lldb.eStateExited, PROCESS_EXITED) # Expect to find 'a' on the call stacks two times. self.assertTrue(callsOfA == 2, "Expect to find 'a' on the call stacks two times") # By design, the 'a' call frame has the following arg vals: # o a((int)val=1, (char)ch='A') # o a((int)val=3, (char)ch='A') if self.TraceOn(): print "Full stack traces when stopped on the breakpoint 'c':" print session.getvalue() self.expect(session.getvalue(), "Argugment values displayed correctly", exe=False, substrs=[ "a((int)val=1, (char)ch='A')", "a((int)val=3, (char)ch='A')" ])
# print main_bp # Launch the process. Since we specified synchronous mode, we won't return # from this function until we hit the breakpoint at main process = target.LaunchSimple(None, None, os.getcwd()) # process = target.Attach (attach_info, error) # Make sure the launch went ok if process: # Print some simple process info state = process.GetState() print "Process info %s" % process for thread in process: ID = thread.GetThreadID() print "thread id: %d" % ID frames = thread.frames for frame in frames: print frame registers = lldbutil.get_GPRs(frame) for reg in registers: print "%s => %s" % (reg.GetName(), reg.GetValue()) # if thread.GetStopReason() == lldb.eStopReasonBreakpoint: # stopped_due_to_breakpoint = True # for frame in thread: # self.assertTrue(frame.GetThread().GetThreadID() == ID) # if self.TraceOn(): # print frame