Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(142)

Side by Side Diff: appengine/findit/crash/clusterfuzz_parser.py

Issue 2593593003: [Predator] Add Clusterfuzz stacktrace parser. (Closed)
Patch Set: fix nits. Created 3 years, 12 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(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()
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698