TestClassTypesDisassembly.py revision ff812486d6a8895ebf80b33431b63ffa7d216468
110cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chen""" 210cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny ChenTest the lldb disassemble command on each call frame when stopped on C's ctor. 310cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chen""" 410cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chen 510cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chenimport os, time 610cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chenimport unittest2 710cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chenimport lldb 810cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chenfrom lldbtest import * 910cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chen 1010cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chenclass IterateFrameAndDisassembleTestCase(TestBase): 1110cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chen 1210cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chen mydir = "class_types" 1310cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chen 1410cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chen @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin") 1510cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chen def test_with_dsym_and_run_command(self): 1610cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chen """Disassemble each call frame when stopped on C's constructor.""" 1710cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chen self.buildDsym() 1810cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chen self.disassemble_call_stack() 1910cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chen 2010cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chen def test_with_dwarf_and_run_command(self): 2110cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chen """Disassemble each call frame when stopped on C's constructor.""" 2210cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chen self.buildDwarf() 2310cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chen self.disassemble_call_stack() 2410cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chen 2510cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chen @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin") 260678f8e583d79475c574cfc89f77e616fa2468c5Johnny Chen @python_api_test 2710cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chen def test_with_dsym_and_python_api(self): 2810cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chen """Disassemble each call frame when stopped on C's constructor.""" 2910cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chen self.buildDsym() 300678f8e583d79475c574cfc89f77e616fa2468c5Johnny Chen self.disassemble_call_stack_python() 3110cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chen 320678f8e583d79475c574cfc89f77e616fa2468c5Johnny Chen @python_api_test 3310cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chen def test_with_dwarf_and_python_api(self): 3410cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chen """Disassemble each call frame when stopped on C's constructor.""" 3510cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chen self.buildDwarf() 360678f8e583d79475c574cfc89f77e616fa2468c5Johnny Chen self.disassemble_call_stack_python() 3710cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chen 387bafa919529dd7e3d87e9c3649179029d0158978Johnny Chen def setUp(self): 390910eb32b94bd67b0357d34d0951aad197742569Johnny Chen # Call super's setUp(). 400910eb32b94bd67b0357d34d0951aad197742569Johnny Chen TestBase.setUp(self) 417bafa919529dd7e3d87e9c3649179029d0158978Johnny Chen # Find the line number to break for main.cpp. 427bafa919529dd7e3d87e9c3649179029d0158978Johnny Chen self.line = line_number('main.cpp', '// Set break point at this line.') 437bafa919529dd7e3d87e9c3649179029d0158978Johnny Chen 4410cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chen def breakOnCtor(self): 4510cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chen """Setup/run the program so it stops on C's constructor.""" 4610cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chen exe = os.path.join(os.getcwd(), "a.out") 4710cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chen self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET) 4810cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chen 4910cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chen # Break on the ctor function of class C. 507bafa919529dd7e3d87e9c3649179029d0158978Johnny Chen self.expect("breakpoint set -f main.cpp -l %d" % self.line, 517bafa919529dd7e3d87e9c3649179029d0158978Johnny Chen BREAKPOINT_CREATED, 527bafa919529dd7e3d87e9c3649179029d0158978Johnny Chen startstr = "Breakpoint created: 1: file ='main.cpp', line = %d" % 537bafa919529dd7e3d87e9c3649179029d0158978Johnny Chen self.line) 5410cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chen 5510cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chen self.runCmd("run", RUN_SUCCEEDED) 5610cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chen 5710cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chen # The stop reason of the thread should be breakpoint. 5810cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chen self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT, 59abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton substrs = ['stopped', 6010cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chen 'stop reason = breakpoint']) 6110cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chen 6210cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chen # We should be stopped on the ctor function of class C. 6310cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chen self.expect("thread backtrace", BACKTRACE_DISPLAYED_CORRECTLY, 6410cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chen substrs = ['C::C']) 6510cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chen 6610cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chen def disassemble_call_stack(self): 6710cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chen """Disassemble each call frame when stopped on C's constructor.""" 6810cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chen self.breakOnCtor() 6910cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chen 7010cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chen raw_output = self.res.GetOutput() 7110cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chen frameRE = re.compile(r""" 7210cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chen ^\s\sframe # heading for the frame info, 7310cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chen .* # wildcard, and 7410cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chen 0x[0-9a-f]{16} # the frame pc, and 7510cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chen \sa.out`(.+) # module`function, and 7610cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chen \s\+\s # the rest ' + ....' 7710cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chen """, re.VERBOSE) 7810cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chen for line in raw_output.split(os.linesep): 7910cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chen match = frameRE.search(line) 8010cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chen if match: 8110cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chen function = match.group(1) 8210cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chen #print "line:", line 8310cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chen #print "function:", function 8410cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chen self.runCmd("disassemble -n '%s'" % function) 8510cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chen 860678f8e583d79475c574cfc89f77e616fa2468c5Johnny Chen def disassemble_call_stack_python(self): 8710cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chen """Disassemble each call frame when stopped on C's constructor.""" 8810cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chen self.breakOnCtor() 8910cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chen 9010cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chen # Now use the Python API to get at each function on the call stack and 9110cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chen # disassemble it. 9210cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chen target = self.dbg.GetSelectedTarget() 9310cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chen process = target.GetProcess() 9410cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chen thread = process.GetThreadAtIndex(0) 9510cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chen depth = thread.GetNumFrames() 9610cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chen for i in range(depth - 1): 9710cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chen frame = thread.GetFrameAtIndex(i) 9810cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chen function = frame.GetFunction() 9943ca9c1249e496802b26c66e3a945560ebfb908cJohnny Chen # Print the function header. 10043ca9c1249e496802b26c66e3a945560ebfb908cJohnny Chen print 10143ca9c1249e496802b26c66e3a945560ebfb908cJohnny Chen print function 10243ca9c1249e496802b26c66e3a945560ebfb908cJohnny Chen if function.IsValid(): 10343ca9c1249e496802b26c66e3a945560ebfb908cJohnny Chen # Get all instructions for this function and print them out. 10443ca9c1249e496802b26c66e3a945560ebfb908cJohnny Chen insts = function.GetInstructions(target) 10543ca9c1249e496802b26c66e3a945560ebfb908cJohnny Chen from lldbutil import lldb_iter 106ff812486d6a8895ebf80b33431b63ffa7d216468Johnny Chen for inst in lldb_iter(insts, 'GetSize', 'GetInstructionAtIndex'): 107ff812486d6a8895ebf80b33431b63ffa7d216468Johnny Chen # It could simply be 'print inst' to print out the disassembly. 108ff812486d6a8895ebf80b33431b63ffa7d216468Johnny Chen # But we want to print to stdout only if self.TraceOn() is True. 109ff812486d6a8895ebf80b33431b63ffa7d216468Johnny Chen disasm = str(inst) 110ff812486d6a8895ebf80b33431b63ffa7d216468Johnny Chen if self.TraceOn(): 111ff812486d6a8895ebf80b33431b63ffa7d216468Johnny Chen print disasm 11210cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chen 11310cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chen 11410cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chenif __name__ == '__main__': 11510cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chen import atexit 11610cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chen lldb.SBDebugger.Initialize() 11710cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chen atexit.register(lambda: lldb.SBDebugger.Terminate()) 11810cd823ddc9ef4124fafdb43ca24da28f5c8fa32Johnny Chen unittest2.main() 119