def testParseStackFrameForJavaCallstackFormat(self):
        language_type = None
        format_type = CallStackFormatType.JAVA
        self.assertIsNone(
            StackFrame.Parse(language_type, format_type, 'dummy line', {}))

        deps = {'org/': Dependency('org/', 'https://repo', '1')}
        frame = StackFrame.Parse(language_type, format_type,
                                 '  at org.a.b(a.java:609)', deps)
        self._VerifyTwoStackFramesEqual(
            frame,
            StackFrame(0, 'org/', 'org.a.b', 'a.java', 'org/a.java', [609]))
Example #2
0
    def testParseStackFrameForSyzyasanCallstackFormat(self):
        language_type = None
        format_type = CallStackFormatType.SYZYASAN
        self.assertIsNone(
            StackFrame.Parse(language_type, format_type, 'dummy line', {}))

        deps = {'src/content': Dependency('src/content', 'https://repo', '1')}
        frame = StackFrame.Parse(language_type, format_type,
                                 'c::p::n [src/content/e.cc @ 165]', deps)
        self._VerifyTwoStackFramesEqual(
            frame,
            StackFrame(0, 'src/content', 'c::p::n', 'e.cc', 'src/content/e.cc',
                       [165]))
Example #3
0
    def Parse(self,
              stacktrace_string,
              deps,
              signature=None,
              top_n_frames=None):
        """Parse fracas stacktrace string into Stacktrace instance."""
        # Filters to filter callstack buffers.
        filters = [
            callstack_filters.FilterInlineFunction(),
            callstack_filters.KeepTopNFrames(top_n_frames
                                             or DEFAULT_TOP_N_FRAMES)
        ]
        stacktrace_buffer = StacktraceBuffer(signature=signature,
                                             filters=filters)

        stack_detector = callstack_detectors.ChromeCrashStackDetector()
        # Initial background callstack which is not to be added into Stacktrace.
        stack_buffer = CallStackBuffer()
        for line in stacktrace_string.splitlines():
            start_of_callstack = stack_detector(line)

            if start_of_callstack:
                stacktrace_buffer.AddFilteredStack(stack_buffer)
                stack_buffer = CallStackBuffer.FromStartOfCallStack(
                    start_of_callstack)
            else:
                frame = StackFrame.Parse(stack_buffer.language_type,
                                         stack_buffer.format_type, line, deps,
                                         len(stack_buffer.frames))
                if frame is not None:
                    stack_buffer.frames.append(frame)

        # Add the last stack to stacktrace.
        stacktrace_buffer.AddFilteredStack(stack_buffer)
        return stacktrace_buffer.ToStacktrace()
    def Parse(
            self,
            stacktrace_string,
            deps,
            job_type,  # pylint: disable=W0221
            sanitizer,
            signature=None,
            top_n_frames=None,
            crash_address=None):
        """Parse clusterfuzz stacktrace string into Stacktrace instance."""
        filters = [
            FilterJavaJreSdkFrames(),
            KeepV8FramesIfV8GeneratedJITCrash(),
            FilterV8FramesForV8APIBindingCode(crash_address),
            FilterFramesAfterBlinkGeneratedCode(),
            FilterV8FramesIfV8NotInTopFrames(),
            KeepTopNFrames(top_n_frames or DEFAULT_TOP_N_FRAMES)
        ]
        stacktrace_buffer = StacktraceBuffer(signature=signature,
                                             filters=filters)
        stack_detector = GetCallStackDetector(job_type, sanitizer)
        if stack_detector is None:
            logging.error(
                'Cannot find CallStackDetector for crash %s (job type: %s)',
                signature or '', job_type)
            return None

        # Initial background callstack which is not to be added into Stacktrace.
        stack_buffer = CallStackBuffer()
        # Reset both stacktrace and callstack flags.
        self.flag_manager.ResetAllFlags()
        for line in stacktrace_string.splitlines():
            # Note, some flags like is_first_stack may be changed inside of stack
            # detector.
            start_of_callstack = stack_detector(line, flags=self.flag_manager)

            if start_of_callstack:
                stacktrace_buffer.AddFilteredStack(
                    self.UpdateMetadataWithFlags(stack_buffer))
                # Create new stack and reset callstack scope flags.
                stack_buffer = CallStackBuffer.FromStartOfCallStack(
                    start_of_callstack)
                self.flag_manager.ResetGroupFlags(CALLSTACK_FLAG_GROUP)
            else:
                frame = StackFrame.Parse(stack_buffer.language_type,
                                         stack_buffer.format_type, line, deps,
                                         len(stack_buffer.frames))
                if frame is not None:
                    stack_buffer.frames.append(frame)
                # Turn on flags if condition met.
                self.flag_manager.ConditionallyTurnOnFlags(line)

        # Add the last stack to stacktrace.
        stacktrace_buffer.AddFilteredStack(
            self.UpdateMetadataWithFlags(stack_buffer))
        return stacktrace_buffer.ToStacktrace()
    def testParseStackFrameForFracasJavaStack(self):
        format_type = CallStackFormatType.DEFAULT
        language_type = LanguageType.JAVA

        frame = StackFrame.Parse(language_type, format_type,
                                 '#0 0xxx in android.app.func app.java:2450',
                                 {})
        self._VerifyTwoStackFramesEqual(
            frame,
            StackFrame(0, '', 'android.app.func', 'android/app.java',
                       'android/app.java', [2450]))
    def testParseStackFrameForDefaultCallstackFormat(self):
        language_type = None
        format_type = CallStackFormatType.DEFAULT
        self.assertIsNone(
            StackFrame.Parse(language_type, format_type, 'dummy line', {}))

        deps = {'tp/webrtc/': Dependency('tp/webrtc/', 'https://repo', '1')}
        frame = StackFrame.Parse(language_type, format_type,
                                 '#0 0x52617a in func0 tp/webrtc/a.c:38:3',
                                 deps)
        self._VerifyTwoStackFramesEqual(
            frame,
            StackFrame(0, 'tp/webrtc/', 'func0', 'a.c', 'tp/webrtc/a.c',
                       [38, 39, 40, 41]))

        frame = StackFrame.Parse(
            language_type, format_type,
            '#1 0x526 in func::func2::func3 tp/webrtc/a.c:3:2', deps)
        self._VerifyTwoStackFramesEqual(
            frame,
            StackFrame(1, 'tp/webrtc/', 'func::func2::func3', 'a.c',
                       'tp/webrtc/a.c', [3, 4, 5]))