-
Notifications
You must be signed in to change notification settings - Fork 3.9k
/
utils.dart
66 lines (58 loc) 路 2.33 KB
/
utils.dart
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
// ignore_for_file: require_trailing_commas
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'package:stack_trace/stack_trace.dart';
final _obfuscatedStackTraceLineRegExp =
RegExp(r'^(\s*#\d{2} abs )([\da-f]+)((?: virt [\da-f]+)?(?: .*)?)$');
/// Returns a [List] containing detailed output of each line in a stack trace.
List<Map<String, String>> getStackTraceElements(StackTrace stackTrace) {
final Trace trace = Trace.parseVM(stackTrace.toString()).terse;
final List<Map<String, String>> elements = <Map<String, String>>[];
for (final Frame frame in trace.frames) {
if (frame is UnparsedFrame) {
if (_obfuscatedStackTraceLineRegExp.hasMatch(frame.member)) {
// Same exceptions should be grouped in Crashlytics Console.
// Crashlytics Console groups issues with same stack trace.
// Obfuscated stack traces contains abs address, virt address
// and symbol name + offset. abs addresses are different across
// sessions, Crashlytics is smart enough to group exceptions
// in the same issue. For iOS we use abs address for symbolication
// and for Android we use virt address.
elements.add(<String, String>{
'file': '',
'line': '0',
'method': frame.member,
});
}
} else {
final Map<String, String> element = <String, String>{
'file': frame.library,
'line': frame.line?.toString() ?? '0',
};
final String member = frame.member ?? '<fn>';
final List<String> members = member.split('.');
if (members.length > 1) {
element['method'] = members.sublist(1).join('.');
element['class'] = members.first;
} else {
element['method'] = member;
}
elements.add(element);
}
}
return elements;
}
String? getBuildId(StackTrace stackTrace) {
final Trace trace = Trace.parseVM(stackTrace.toString()).terse;
for (final Frame frame in trace.frames) {
if (frame is UnparsedFrame) {
if (frame.member.startsWith("build_id: '") &&
frame.member.endsWith("'")) {
// format is: "build_id: '8deece9b0e5bf1aa541b5a91e171282e'"
return frame.member.substring(11, frame.member.length - 1);
}
}
}
return null;
}