in github-label-notifier/symbolizer/lib/symbolizer.dart [595:666]
Future<CrashSymbolizationResult> _symbolizeCustomFrames(
CrashSymbolizationResult result,
List<CustomCrashFrame> frames,
String arch,
EngineBuild build,
String symbolsDir) async {
// For now we assuem
final object = p.join(
symbolsDir,
build.variant.os == 'ios'
? 'Flutter.dSYM/Contents/Resources/DWARF/Flutter'
: 'libflutter.so');
// Returns [true] if the given frame is a frame for Flutter
// engine binary which misses an offset.
bool isFrameMissingOffset(CustomCrashFrame frame) {
return /*frame.offset == null &&*/ frame.binary == 'Flutter';
}
var adjustInnerPCs = true;
// If there are frames with missing offsets found try to guess
// load base using a heuristic based on all return addresses from the
// backtrace.
final framesWithoutOffsets = frames.where(isFrameMissingOffset).toList();
if (framesWithoutOffsets.isNotEmpty) {
final loadBase = await _tryFindLoadBase(
build,
framesWithoutOffsets
.where((frame) => int.parse(frame.no) > 0)
.map((frame) => frame.pc)
.toSet()
.toList());
if (loadBase != null) {
// Success: managed to find a single possiblity. Compute relative pcs
// using this loadBase and add a note to the symbolization result.
adjustInnerPCs = !loadBase.pcAdjusted;
result = result.withNote(SymbolizationNoteKind.loadBaseDetected,
_addrHex(loadBase.loadBase, _pointerSize(build.variant.arch)));
frames = frames.map((frame) {
if (isFrameMissingOffset(frame)) {
return frame.copyWith(
offset: frame.pc - loadBase.loadBase,
symbol: 'Flutter',
);
}
return frame;
}).toList();
}
}
return _symbolizeGeneric<CustomCrashFrame>(
result: result,
frames: frames,
arch: arch,
object: object,
shouldSymbolize: (frame) => true,
shouldAdjustInnerPCs: adjustInnerPCs,
getRelativePC: (frame) => frame.offset,
computePCBias: (frames) => 0,
frameSuffix: (frame) => [
'',
if (frame.symbol != null && frame.symbol.isNotEmpty)
frame.symbol
else
frame.binary,
if (frame.offset != null) '+',
if (frame.offset != null) frame.offset,
if (frame.location != null) frame.location.trimLeft(),
].join(' '),
);
}