Future _symbolizeCustomFrames()

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(' '),
    );
  }