Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 # Copyright 2016 The Chromium Authors. All rights reserved. | |
| 2 # Use of this source code is governed by a BSD-style license that can be | |
| 3 # found in the LICENSE file. | |
| 4 | |
| 5 import logging | |
| 6 import re | |
| 7 | |
| 8 from crash import callstack_detectors | |
| 9 from crash.callstack_filters import FilterFramesAfterBlinkGeneratedCode | |
| 10 from crash.callstack_filters import FilterJavaJreSdkFrames | |
| 11 from crash.callstack_filters import FilterV8FramesIfV8APIBindingCode | |
| 12 from crash.callstack_filters import FilterV8FramesIfV8NotInTopFrames | |
| 13 from crash.callstack_filters import KeepV8FramesIfV8GeneratedJITCrash | |
| 14 from crash.callstack_filters import KeepTopNFrames | |
| 15 from crash.flag_manager import Flag | |
| 16 from crash.flag_manager import FlagManager | |
| 17 from crash.stacktrace import CallStackBuffer | |
| 18 from crash.stacktrace import StackFrame | |
| 19 from crash.stacktrace import StacktraceBuffer | |
| 20 from crash.stacktrace_parser import StacktraceParser | |
| 21 from crash.type_enums import CallStackFormatType | |
| 22 from crash.type_enums import LanguageType | |
| 23 from crash.type_enums import SanitizerType | |
| 24 | |
| 25 | |
| 26 TOP_FRAME_HAS_NO_SYMBOLS_REGEX = re.compile( | |
| 27 r'.*#0 0x[0-9a-f]+ \(<unknown module>\).*') | |
| 28 SUMMARY_MARKER = 'SUMMARY:' | |
| 29 JAVA_FATAL_EXCEPTION_REGEX = re.compile('.*FATAL EXCEPTION.*:') | |
| 30 | |
| 31 ANDROID_JOB_TYPE_MARKER = 'android' | |
| 32 DEFAULT_TOP_N_FRAMES = 7 | |
| 33 | |
| 34 CALLSTACK_FLAG_GROUP = 'callstack_flags' | |
| 35 STACKTRACE_FLAG_GROUP = 'stacktrace_flags' | |
| 36 | |
| 37 | |
| 38 def GetCallStackDetector(job_type, sanitizer): | |
| 39 """Gets ``CallStackDetector`` instance to detect start of new callstack.""" | |
|
wrengr
2016/12/22 23:28:36
-> "Returns a ``CallStackDetector`` for the partic
Sharu Jiang
2016/12/28 20:16:46
Done.
| |
| 40 | |
| 41 if ANDROID_JOB_TYPE_MARKER in job_type: | |
| 42 return callstack_detectors.AndroidJobDetector() | |
| 43 | |
| 44 if sanitizer == SanitizerType.SYZYASAN: | |
|
wrengr
2016/12/22 23:28:36
fwiw, rather than doing a bunch of equality tests
Sharu Jiang
2016/12/28 20:16:46
Done.
| |
| 45 return callstack_detectors.SyzyasanDetector() | |
| 46 | |
| 47 if sanitizer == SanitizerType.THREAD_SANITIZER: | |
| 48 return callstack_detectors.TsanDetector() | |
| 49 | |
| 50 if sanitizer == SanitizerType.UBSAN: | |
| 51 return callstack_detectors.UbsanDetector() | |
| 52 | |
| 53 if sanitizer == SanitizerType.MEMORY_SANITIZER: | |
| 54 return callstack_detectors.MsanDetector() | |
| 55 | |
| 56 if sanitizer == SanitizerType.ADDRESS_SANITIZER: | |
| 57 return callstack_detectors.AsanDetector() | |
| 58 | |
| 59 return None | |
| 60 | |
| 61 | |
| 62 class ClusterfuzzParser(StacktraceParser): | |
| 63 | |
| 64 def __init__(self): | |
| 65 self.flag_manager = FlagManager() | |
| 66 self.flag_manager.Register(STACKTRACE_FLAG_GROUP, Flag( | |
| 67 'java_main_stack', lambda line: # pylint: disable=W0108 | |
| 68 JAVA_FATAL_EXCEPTION_REGEX.match(line))) | |
| 69 self.flag_manager.Register(STACKTRACE_FLAG_GROUP, Flag( | |
| 70 'after_summary_line', lambda line: # pylint: disable=W0108 | |
| 71 SUMMARY_MARKER in line)) | |
| 72 # This flag is True at the very beginning and will never be changed once it | |
| 73 # is set to False. | |
| 74 self.flag_manager.Register(STACKTRACE_FLAG_GROUP, Flag( | |
| 75 'is_first_stack', lambda line: False, val=True)) # pylint: disable=W0108 | |
| 76 self.flag_manager.Register(CALLSTACK_FLAG_GROUP, Flag( | |
| 77 'top_frame_has_no_symbol', lambda line: # pylint: disable=W0108 | |
| 78 TOP_FRAME_HAS_NO_SYMBOLS_REGEX.match(line))) | |
| 79 | |
| 80 def Parse(self, stacktrace_string, deps, job_type, # pylint: disable=W0221 | |
| 81 signature=None, top_n_frames=None, | |
| 82 crash_address=None): | |
| 83 """Parse clusterfuzz stacktrace string into Stacktrace instance.""" | |
| 84 filters = [FilterJavaJreSdkFrames(), | |
| 85 KeepV8FramesIfV8GeneratedJITCrash(), | |
| 86 FilterV8FramesIfV8APIBindingCode(crash_address), | |
| 87 FilterFramesAfterBlinkGeneratedCode(), | |
| 88 FilterV8FramesIfV8NotInTopFrames(), | |
| 89 KeepTopNFrames(top_n_frames or DEFAULT_TOP_N_FRAMES)] | |
| 90 sanitizer = SanitizerType.GetSanitizerType(job_type, stacktrace_string) | |
| 91 stacktrace_buffer = StacktraceBuffer(signature=signature, filters=filters) | |
| 92 | |
| 93 stack_detector = GetCallStackDetector(job_type, sanitizer) | |
| 94 if stack_detector is None: | |
| 95 logging.error('Cannot find CallStackDetector for crash %s (job type: %s)', | |
| 96 signature or '', job_type) | |
| 97 return None | |
| 98 | |
| 99 # Initial background callstack which is not to be added into Stacktrace. | |
| 100 stack_buffer = CallStackBuffer() | |
| 101 # Reset both stacktarce and callstack flags. | |
|
wrengr
2016/12/22 23:28:36
"stacktarce" -> "stacktrace"
Sharu Jiang
2016/12/28 20:16:46
Done.
| |
| 102 self.flag_manager.Reset() | |
| 103 for line in stacktrace_string.splitlines(): | |
| 104 # Note, some flags like is_first_stack may be changed inside of stack | |
| 105 # detector. | |
| 106 is_new_callstack, priority, format_type, language_type, metadata = ( | |
| 107 stack_detector.IsStartOfNewCallStack(line, flags=self.flag_manager)) | |
| 108 | |
| 109 if is_new_callstack: | |
| 110 # Reset callstack scope flags. | |
| 111 self.flag_manager.Reset(CALLSTACK_FLAG_GROUP) | |
| 112 stacktrace_buffer.AddFilteredStack(stack_buffer) | |
| 113 stack_buffer = CallStackBuffer(priority=priority, | |
| 114 format_type=format_type, | |
| 115 language_type=language_type, | |
| 116 metadata=metadata) | |
| 117 else: | |
| 118 frame = StackFrame.Parse(stack_buffer.language_type, | |
| 119 stack_buffer.format_type, line, deps, | |
| 120 len(stack_buffer.frames)) | |
| 121 if frame is not None: | |
| 122 stack_buffer.frames.append(frame) | |
| 123 # Turn on flags if condition met. | |
| 124 self.flag_manager.ConditionallyTurnOn(line) | |
| 125 | |
| 126 # Add the last stack to stacktrace. | |
| 127 stacktrace_buffer.AddFilteredStack(stack_buffer) | |
| 128 return stacktrace_buffer.ToStacktrace() | |
| OLD | NEW |