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