示例#1
0
    def unique_types(self):
        """Test for unique types of std::vector<long> and std::vector<short>."""
        exe = os.path.join(os.getcwd(), "a.out")
        self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)

        self.expect(
            "breakpoint set -f main.cpp -l %d" % self.line,
            BREAKPOINT_CREATED,
            startstr=
            "Breakpoint created: 1: file ='main.cpp', line = %d, locations = 1"
            % self.line)

        self.runCmd("run", RUN_SUCCEEDED)

        # The stop reason of the thread should be breakpoint.
        self.expect("thread list",
                    STOPPED_DUE_TO_BREAKPOINT,
                    substrs=['stopped', 'stop reason = breakpoint'])

        if self.getCompiler().endswith('clang'):
            import re
            clang_version_output = system(
                [lldbutil.which(self.getCompiler()), "-v"])[1]
            #print "my output:", clang_version_output
            for line in clang_version_output.split(os.linesep):
                m = re.search('clang version ([0-9]+)\.', line)
                #print "line:", line
                if m:
                    clang_version = int(m.group(1))
                    #print "clang version:", clang_version
                    if clang_version < 3:
                        self.skipTest(
                            "rdar://problem/9173060 lldb hangs while running unique-types for clang version < 3"
                        )

        # Do a "frame variable -T longs" and verify "long" is in each line of output.
        self.runCmd("frame variable -T longs")
        output = self.res.GetOutput()
        for x in [line.strip() for line in output.split(os.linesep)]:
            # Skip empty line or closing brace.
            if not x or x == '}':
                continue
            self.expect(x, "Expect type 'long'", exe=False, substrs=['long'])

        # Do a "frame variable -T shorts" and verify "short" is in each line of output.
        self.runCmd("frame variable -T shorts")
        output = self.res.GetOutput()
        for x in [line.strip() for line in output.split(os.linesep)]:
            # Skip empty line or closing brace.
            if not x or x == '}':
                continue
            self.expect(x, "Expect type 'short'", exe=False, substrs=['short'])
示例#2
0
    def unique_types(self):
        """Test for unique types of std::vector<long> and std::vector<short>."""
        exe = os.path.join(os.getcwd(), "a.out")
        self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)

        self.expect("breakpoint set -f main.cpp -l %d" % self.line,
                    BREAKPOINT_CREATED,
            startstr = "Breakpoint created: 1: file ='main.cpp', line = %d, locations = 1" %
                        self.line)

        self.runCmd("run", RUN_SUCCEEDED)

        # The stop reason of the thread should be breakpoint.
        self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
            substrs = ['stopped',
                       'stop reason = breakpoint'])

        if self.getCompiler().endswith('clang'):
            import re
            clang_version_output = system([lldbutil.which(self.getCompiler()), "-v"])[1]
            #print "my output:", clang_version_output
            for line in clang_version_output.split(os.linesep):
                m = re.search('clang version ([0-9]+)\.', line)
                #print "line:", line
                if m:
                    clang_version = int(m.group(1))
                    #print "clang version:", clang_version
                    if clang_version < 3:
                        self.skipTest("rdar://problem/9173060 lldb hangs while running unique-types for clang version < 3")

        # Do a "frame variable -T longs" and verify "long" is in each line of output.
        self.runCmd("frame variable -T longs")
        output = self.res.GetOutput()
        for x in [line.strip() for line in output.split(os.linesep)]:
            # Skip empty line or closing brace.
            if not x or x == '}':
                continue
            self.expect(x, "Expect type 'long'", exe=False,
                substrs = ['long'])

        # Do a "frame variable -T shorts" and verify "short" is in each line of output.
        self.runCmd("frame variable -T shorts")
        output = self.res.GetOutput()
        for x in [line.strip() for line in output.split(os.linesep)]:
            # Skip empty line or closing brace.
            if not x or x == '}':
                continue
            self.expect(x, "Expect type 'short'", exe=False,
                substrs = ['short'])
    def data_formatter_commands(self):
        """Test that that file and class static variables display correctly."""
        self.runCmd("file a.out", CURRENT_EXECUTABLE_SET)

        self.expect(
            "breakpoint set -f main.cpp -l %d" % self.line,
            BREAKPOINT_CREATED,
            startstr=
            "Breakpoint created: 1: file ='main.cpp', line = %d, locations = 1"
            % self.line)

        self.runCmd("run", RUN_SUCCEEDED)

        # The stop reason of the thread should be breakpoint.
        self.expect("thread list",
                    STOPPED_DUE_TO_BREAKPOINT,
                    substrs=['stopped', 'stop reason = breakpoint'])

        # This is the function to remove the custom formats in order to have a
        # clean slate for the next test case.
        def cleanup():
            self.runCmd('type format clear', check=False)
            self.runCmd('type summary clear', check=False)

        # Execute the cleanup function during test case tear down.
        self.addTearDownHook(cleanup)

        # Setup the summaries for this scenario
        #self.runCmd("type summary add --summary-string \"${var._M_dataplus._M_p}\" std::string")
        self.runCmd(
            "type summary add --summary-string \"Level 1\" \"DeepData_1\"")
        self.runCmd(
            "type summary add --summary-string \"Level 2\" \"DeepData_2\" -e")
        self.runCmd(
            "type summary add --summary-string \"Level 3\" \"DeepData_3\"")
        self.runCmd(
            "type summary add --summary-string \"Level 4\" \"DeepData_4\"")
        self.runCmd(
            "type summary add --summary-string \"Level 5\" \"DeepData_5\"")

        # Default case, just print out summaries
        self.expect('frame variable',
                    substrs=[
                        '(DeepData_1) data1 = Level 1',
                        '(DeepData_2) data2 = Level 2 {', 'm_child1 = Level 3',
                        'm_child2 = Level 3', 'm_child3 = Level 3',
                        'm_child4 = Level 3', '}'
                    ])

        # Skip the default (should be 1) levels of summaries
        self.expect('frame variable -Y',
                    substrs=[
                        '(DeepData_1) data1 = {', 'm_child1 = 0x', '}',
                        '(DeepData_2) data2 = {', 'm_child1 = Level 3',
                        'm_child2 = Level 3', 'm_child3 = Level 3',
                        'm_child4 = Level 3', '}'
                    ])

        # Now skip 2 levels of summaries
        self.expect('frame variable -Y2',
                    substrs=[
                        '(DeepData_1) data1 = {', 'm_child1 = 0x', '}',
                        '(DeepData_2) data2 = {', 'm_child1 = {',
                        'm_child1 = 0x', 'Level 4', 'm_child2 = {',
                        'm_child3 = {', '}'
                    ])

        # Check that no "Level 3" comes out
        self.expect('frame variable data1.m_child1 -Y2',
                    matching=False,
                    substrs=['Level 3'])

        # Now expand a pointer with 2 level of skipped summaries
        self.expect('frame variable data1.m_child1 -Y2',
                    substrs=['(DeepData_2 *) data1.m_child1 = 0x'])

        # Deref and expand said pointer
        self.expect('frame variable *data1.m_child1 -Y2',
                    substrs=[
                        '(DeepData_2) *data1.m_child1 = {', 'm_child2 = {',
                        'm_child1 = 0x', 'Level 4', '}'
                    ])

        # Expand an expression, skipping 2 layers of summaries
        self.expect('frame variable data1.m_child1->m_child2 -Y2',
                    substrs=[
                        '(DeepData_3) data1.m_child1->m_child2 = {',
                        'm_child2 = {', 'm_child1 = Level 5',
                        'm_child2 = Level 5', 'm_child3 = Level 5', '}'
                    ])

        # Expand same expression, skipping only 1 layer of summaries
        self.expect('frame variable data1.m_child1->m_child2 -Y1',
                    substrs=[
                        '(DeepData_3) data1.m_child1->m_child2 = {',
                        'm_child1 = 0x', 'Level 4', 'm_child2 = Level 4', '}'
                    ])

        # Bad debugging info on SnowLeopard gcc (Apple Inc. build 5666).
        # Skip the following tests if the condition is met.
        if self.getCompiler().endswith(
                'gcc') and not self.getCompiler().endswith('llvm-gcc'):
            import re, lldbutil
            gcc_version_output = system(
                [lldbutil.which(self.getCompiler()), "-v"])[1]
            #print "my output:", gcc_version_output
            for line in gcc_version_output.split(os.linesep):
                m = re.search('\(Apple Inc\. build ([0-9]+)\)', line)
                #print "line:", line
                if m:
                    gcc_build = int(m.group(1))
                    #print "gcc build:", gcc_build
                    if gcc_build >= 5666:
                        # rdar://problem/9804600"
                        self.skipTest(
                            "rdar://problem/9804600 wrong namespace for std::string in debug info"
                        )

        # Expand same expression, skipping 3 layers of summaries
        self.expect('frame variable data1.m_child1->m_child2 -T -Y3',
                    substrs=[
                        '(DeepData_3) data1.m_child1->m_child2 = {',
                        'm_some_text = "Just a test"', 'm_child2 = {',
                        'm_some_text = "Just a test"'
                    ])

        # Expand within a standard string (might depend on the implementation of the C++ stdlib you use)
        self.expect(
            'frame variable data1.m_child1->m_child2.m_child1.m_child2 -Y2',
            substrs=[
                '(DeepData_5) data1.m_child1->m_child2.m_child1.m_child2 = {',
                'm_some_text = {', '_M_dataplus = {', '_M_p = 0x',
                '"Just a test"'
            ])

        # Repeat the above, but only skip 1 level of summaries
        self.expect(
            'frame variable data1.m_child1->m_child2.m_child1.m_child2 -Y1',
            substrs=[
                '(DeepData_5) data1.m_child1->m_child2.m_child1.m_child2 = {',
                'm_some_text = "Just a test"', '}'
            ])

        # Change summary and expand, first without -Y then with -Y
        self.runCmd(
            "type summary add --summary-string \"${var.m_some_text}\" DeepData_5"
        )

        self.expect(
            'fr var data2.m_child4.m_child2.m_child2',
            substrs=[
                '(DeepData_5) data2.m_child4.m_child2.m_child2 = "Just a test"'
            ])

        self.expect('fr var data2.m_child4.m_child2.m_child2 -Y',
                    substrs=[
                        '(DeepData_5) data2.m_child4.m_child2.m_child2 = {',
                        'm_some_text = "Just a test"', '}'
                    ])
    def data_formatter_commands(self):
        """Test that that file and class static variables display correctly."""
        self.runCmd("file a.out", CURRENT_EXECUTABLE_SET)

        #import lldbutil
        lldbutil.run_break_set_by_file_and_line (self, "main.cpp", self.line, num_expected_locations=1, loc_exact=True)


        self.runCmd("run", RUN_SUCCEEDED)

        # The stop reason of the thread should be breakpoint.
        self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
            substrs = ['stopped',
                       'stop reason = breakpoint'])

        # This is the function to remove the custom formats in order to have a
        # clean slate for the next test case.
        def cleanup():
            self.runCmd('type format clear', check=False)
            self.runCmd('type summary clear', check=False)

        # Execute the cleanup function during test case tear down.
        self.addTearDownHook(cleanup)

        # Setup the summaries for this scenario
        #self.runCmd("type summary add --summary-string \"${var._M_dataplus._M_p}\" std::string")
        self.runCmd("type summary add --summary-string \"Level 1\" \"DeepData_1\"")
        self.runCmd("type summary add --summary-string \"Level 2\" \"DeepData_2\" -e")
        self.runCmd("type summary add --summary-string \"Level 3\" \"DeepData_3\"")
        self.runCmd("type summary add --summary-string \"Level 4\" \"DeepData_4\"")
        self.runCmd("type summary add --summary-string \"Level 5\" \"DeepData_5\"")
            
        # Default case, just print out summaries
        self.expect('frame variable',
            substrs = ['(DeepData_1) data1 = Level 1',
                       '(DeepData_2) data2 = Level 2 {',
                       'm_child1 = Level 3',
                       'm_child2 = Level 3',
                       'm_child3 = Level 3',
                       'm_child4 = Level 3',
                       '}'])

        # Skip the default (should be 1) levels of summaries
        self.expect('frame variable --no-summary-depth',
            substrs = ['(DeepData_1) data1 = {',
                       'm_child1 = 0x',
                       '}',
                       '(DeepData_2) data2 = {',
                       'm_child1 = Level 3',
                       'm_child2 = Level 3',
                       'm_child3 = Level 3',
                       'm_child4 = Level 3',
                       '}'])

        # Now skip 2 levels of summaries
        self.expect('frame variable --no-summary-depth=2',
            substrs = ['(DeepData_1) data1 = {',
                       'm_child1 = 0x',
                       '}',
                       '(DeepData_2) data2 = {',
                       'm_child1 = {',
                       'm_child1 = 0x',
                       'Level 4',
                       'm_child2 = {',
                       'm_child3 = {',
                       '}'])

        # Check that no "Level 3" comes out
        self.expect('frame variable data1.m_child1 --no-summary-depth=2', matching=False,
            substrs = ['Level 3'])

        # Now expand a pointer with 2 level of skipped summaries
        self.expect('frame variable data1.m_child1 --no-summary-depth=2',
                    substrs = ['(DeepData_2 *) data1.m_child1 = 0x'])

        # Deref and expand said pointer
        self.expect('frame variable *data1.m_child1 --no-summary-depth=2',
                    substrs = ['(DeepData_2) *data1.m_child1 = {',
                               'm_child2 = {',
                               'm_child1 = 0x',
                               'Level 4',
                               '}'])

        # Expand an expression, skipping 2 layers of summaries
        self.expect('frame variable data1.m_child1->m_child2 --no-summary-depth=2',
                substrs = ['(DeepData_3) data1.m_child1->m_child2 = {',
                           'm_child2 = {',
                           'm_child1 = Level 5',
                           'm_child2 = Level 5',
                           'm_child3 = Level 5',
                           '}'])

        # Expand same expression, skipping only 1 layer of summaries
        self.expect('frame variable data1.m_child1->m_child2 --no-summary-depth=1',
                    substrs = ['(DeepData_3) data1.m_child1->m_child2 = {',
                               'm_child1 = 0x',
                               'Level 4',
                               'm_child2 = Level 4',
                               '}'])

        # Bad debugging info on SnowLeopard gcc (Apple Inc. build 5666).
        # Skip the following tests if the condition is met.
        if self.getCompiler().endswith('gcc') and not self.getCompiler().endswith('llvm-gcc'):
           import re
           gcc_version_output = system([lldbutil.which(self.getCompiler()), "-v"])[1]
           #print "my output:", gcc_version_output
           for line in gcc_version_output.split(os.linesep):
               m = re.search('\(Apple Inc\. build ([0-9]+)\)', line)
               #print "line:", line
               if m:
                   gcc_build = int(m.group(1))
                   #print "gcc build:", gcc_build
                   if gcc_build >= 5666:
                       # rdar://problem/9804600"
                       self.skipTest("rdar://problem/9804600 wrong namespace for std::string in debug info")

        # Expand same expression, skipping 3 layers of summaries
        self.expect('frame variable data1.m_child1->m_child2 --show-types --no-summary-depth=3',
                    substrs = ['(DeepData_3) data1.m_child1->m_child2 = {',
                               'm_some_text = "Just a test"',
                               'm_child2 = {',
                               'm_some_text = "Just a test"'])

        # Expand within a standard string (might depend on the implementation of the C++ stdlib you use)
        self.expect('frame variable data1.m_child1->m_child2.m_child1.m_child2 --no-summary-depth=2',
            substrs = ['(DeepData_5) data1.m_child1->m_child2.m_child1.m_child2 = {',
                       'm_some_text = {',
                       '_M_dataplus = {',
                       '_M_p = 0x',
                       '"Just a test"'])

        # Repeat the above, but only skip 1 level of summaries
        self.expect('frame variable data1.m_child1->m_child2.m_child1.m_child2 --no-summary-depth=1',
                    substrs = ['(DeepData_5) data1.m_child1->m_child2.m_child1.m_child2 = {',
                               'm_some_text = "Just a test"',
                               '}'])

        # Change summary and expand, first without --no-summary-depth then with --no-summary-depth
        self.runCmd("type summary add --summary-string \"${var.m_some_text}\" DeepData_5")
        
        self.expect('fr var data2.m_child4.m_child2.m_child2',
            substrs = ['(DeepData_5) data2.m_child4.m_child2.m_child2 = "Just a test"'])

        self.expect('fr var data2.m_child4.m_child2.m_child2 --no-summary-depth',
                    substrs = ['(DeepData_5) data2.m_child4.m_child2.m_child2 = {',
                               'm_some_text = "Just a test"',
                               '}'])