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

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

Issue 2593593003: [Predator] Add Clusterfuzz stacktrace parser. (Closed)
Patch Set: Rebase and fix nit. Created 3 years, 11 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
1 # Copyright 2016 The Chromium Authors. All rights reserved. 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 2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file. 3 # found in the LICENSE file.
4 4
5 import math 5 import math
6 import re 6 import re
7 7
8 from crash import callstack_detectors
8 from crash import callstack_filters 9 from crash import callstack_filters
9 from crash.stacktrace import CallStackBuffer 10 from crash.stacktrace import CallStackBuffer
10 from crash.stacktrace import StacktraceBuffer 11 from crash.stacktrace import StacktraceBuffer
11 from crash.stacktrace import StackFrame 12 from crash.stacktrace import StackFrame
12 from crash.stacktrace import Stacktrace 13 from crash.stacktrace import Stacktrace
13 from crash.stacktrace_parser import StacktraceParser 14 from crash.stacktrace_parser import StacktraceParser
14 from crash.type_enums import CallStackFormatType 15 from crash.type_enums import CallStackFormatType
15 from crash.type_enums import LanguageType 16 from crash.type_enums import LanguageType
16 17
17 FRACAS_CALLSTACK_START_PATTERN = re.compile(r'CRASHED \[(.*) @ 0x(.*)\]')
18 JAVA_CALLSTACK_START_PATTERN = re.compile(r'\(JAVA\) CRASHED \[(.*) @ 0x(.*)\]')
19 DEFAULT_TOP_N_FRAMES = 7 18 DEFAULT_TOP_N_FRAMES = 7
20 19
21 20
22 class ChromeCrashParser(StacktraceParser): 21 class ChromeCrashParser(StacktraceParser):
23 22
24 def Parse(self, stacktrace_string, deps, signature=None, top_n_frames=None): 23 def Parse(self, stacktrace_string, deps, signature=None, top_n_frames=None):
25 """Parse fracas stacktrace string into Stacktrace instance.""" 24 """Parse fracas stacktrace string into Stacktrace instance."""
26 # Filters to filter callstack buffers. 25 # Filters to filter callstack buffers.
27 filters = [callstack_filters.FilterInlineFunction(), 26 filters = [callstack_filters.FilterInlineFunction(),
28 callstack_filters.KeepTopNFrames(top_n_frames or 27 callstack_filters.KeepTopNFrames(top_n_frames or
29 DEFAULT_TOP_N_FRAMES)] 28 DEFAULT_TOP_N_FRAMES)]
30 stacktrace_buffer = StacktraceBuffer(signature=signature, filters=filters) 29 stacktrace_buffer = StacktraceBuffer(signature=signature, filters=filters)
31 30
31 stack_detector = callstack_detectors.ChromeCrashStackDetector()
32 # Initial background callstack which is not to be added into Stacktrace. 32 # Initial background callstack which is not to be added into Stacktrace.
33 stack_buffer = CallStackBuffer() 33 stack_buffer = CallStackBuffer()
34 for line in stacktrace_string.splitlines(): 34 for line in stacktrace_string.splitlines():
35 is_new_callstack, priority, format_type, language_type = ( 35 is_new_callstack, priority, format_type, language_type, metadata = (
36 self._IsStartOfNewCallStack(line)) 36 stack_detector.IsStartOfNewCallStack(line))
37 37
38 if is_new_callstack: 38 if is_new_callstack:
39 stacktrace_buffer.AddFilteredStack(stack_buffer) 39 stacktrace_buffer.AddFilteredStack(stack_buffer)
40 stack_buffer = CallStackBuffer(priority=priority, 40 stack_buffer = CallStackBuffer(priority=priority,
41 format_type=format_type, 41 format_type=format_type,
42 language_type=language_type) 42 language_type=language_type,
43 metadata=metadata)
43 else: 44 else:
44 frame = StackFrame.Parse(stack_buffer.language_type, 45 frame = StackFrame.Parse(stack_buffer.language_type,
45 stack_buffer.format_type, line, deps, 46 stack_buffer.format_type, line, deps,
46 len(stack_buffer.frames)) 47 len(stack_buffer.frames))
47 if frame is not None: 48 if frame is not None:
48 stack_buffer.frames.append(frame) 49 stack_buffer.frames.append(frame)
49 50
50 # Add the last stack to stacktrace. 51 # Add the last stack to stacktrace.
51 stacktrace_buffer.AddFilteredStack(stack_buffer) 52 stacktrace_buffer.AddFilteredStack(stack_buffer)
52
53 return stacktrace_buffer.ToStacktrace() 53 return stacktrace_buffer.ToStacktrace()
54
55 def _IsStartOfNewCallStack(self, line):
56 """Determine whether a line is a start of a callstack or not.
57
58 Returns a tuple - (is_new_callstack, stack_priority, format_type,
59 language type).
60 """
61 if FRACAS_CALLSTACK_START_PATTERN.match(line):
62 #Fracas only provide magic signature stack (crash stack).
63 return True, 0, CallStackFormatType.DEFAULT, LanguageType.CPP
64
65 if JAVA_CALLSTACK_START_PATTERN.match(line):
66 return True, 0, CallStackFormatType.DEFAULT, LanguageType.JAVA
67
68 return False, None, None, None
OLDNEW
« no previous file with comments | « appengine/findit/crash/callstack_detectors.py ('k') | appengine/findit/crash/clusterfuzz_parser.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698