Future _symbolizeIosFrames()

in github-label-notifier/symbolizer/lib/symbolizer.dart [526:593]


  Future<CrashSymbolizationResult> _symbolizeIosFrames(
      CrashSymbolizationResult result,
      List<IosCrashFrame> frames,
      String arch,
      EngineBuild build,
      String symbolsDir) async {
    final object =
        p.join(symbolsDir, 'Flutter.dSYM/Contents/Resources/DWARF/Flutter');

    // Returns [true] if the given frame is a frame for Flutter
    // engine binary which misses an offset.
    bool isFrameMissingOffset(IosCrashFrame frame) {
      return frame.offset == null &&
          frame.binary == 'Flutter' &&
          frame.symbol == CrashFrame.crashalyticsMissingSymbol;
    }

    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<IosCrashFrame>(
      result: result,
      frames: frames,
      arch: arch,
      object: object,
      shouldSymbolize: (frame) =>
          frame.symbol == 'Flutter' || frame.symbol.startsWith('0x'),
      shouldAdjustInnerPCs: adjustInnerPCs,
      getRelativePC: (frame) => frame.offset,
      computePCBias: (frames) => 0,
      frameSuffix: (frame) => [
        '',
        frame.symbol,
        if (frame.offset != null) '+',
        if (frame.offset != null) frame.offset,
        if (frame.location.isNotEmpty) '(${frame.location.trimLeft()})',
      ].join(' '),
    );
  }