in github-label-notifier/symbolizer/lib/symbolizer.dart [134:204]
Future<CrashSymbolizationResult> _symbolizeCrash(
Crash crash, String engineHash, SymbolizationOverrides overrides) async {
// Apply overrides
if (crash.engineVariant.arch == null) {
return _failedToSymbolize(crash, SymbolizationNoteKind.unknownAbi);
}
EngineBuild engineBuild;
final buildId = _findBuildIdInFrames(crash.frames);
// Even if buildId is available we don't use it for matching
// if mode was found heuristically or was specified through overrides
// already.
if (crash.engineVariant.mode != null ||
overrides?.mode != null ||
buildId == null) {
// Currently on iOS we only have symbols for release builds.
if (crash.engineVariant.os == 'ios') {
if (crash.engineVariant.mode != 'release') {
return _failedToSymbolize(
crash, SymbolizationNoteKind.noSymbolsAvailableOnIos);
}
}
engineBuild = EngineBuild(
engineHash: engineHash,
variant: crash.engineVariant.copyWith(
mode: crash.engineVariant.mode ?? overrides?.mode ?? 'release'),
);
// Note: on iOS build ids (LC_UUID) don't seem to match between
// archived dSYMs and what users report, so we can't rely on them
// for matching dSYMs to crash reports.
} else {
try {
engineBuild = await symbols.findVariantByBuildId(
variant: crash.engineVariant,
engineHash: engineHash,
buildId: buildId);
} catch (e) {
return _failedToSymbolize(
crash, SymbolizationNoteKind.exceptionWhileLookingByBuildId,
error: '(${buildId}) $e');
}
}
var result = await _symbolizeCrashWith(crash, engineBuild);
if (result.symbolized != null &&
buildId == null &&
overrides?.mode == null &&
(crash.engineVariant.mode == null ||
crash.engineVariant.mode != 'release')) {
result = result
.withNote(SymbolizationNoteKind.defaultedToReleaseBuildIdUnavailable);
}
// We might have used wrong symbols for symbolization (because we were
// forced or because our heuristics failed for some reason).
if (buildId != null) {
final symbolsDir = await symbols.get(engineBuild);
final engineBuildId =
await ndk.getBuildId(p.join(symbolsDir, 'libflutter.so'));
if (engineBuildId != buildId) {
result = result.withNote(SymbolizationNoteKind.buildIdMismatch,
'Backtrace refers to ${buildId} but we used engine with ${engineBuildId}');
}
}
return result;
}