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]))
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]))
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]))