Future _symbolizeCrash()

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;
  }