AutorÃa | Ultima modificación | Ver Log |
// Copyright 2019 Google//// Licensed under the Apache License, Version 2.0 (the "License");// you may not use this file except in compliance with the License.// You may obtain a copy of the License at//// http://www.apache.org/licenses/LICENSE-2.0//// Unless required by applicable law or agreed to in writing, software// distributed under the License is distributed on an "AS IS" BASIS,// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.// See the License for the specific language governing permissions and// limitations under the License.#import "Crashlytics/Crashlytics/Operations/Reports/FIRCLSProcessReportOperation.h"#import "Crashlytics/Crashlytics/Helpers/FIRCLSFile.h"#import "Crashlytics/Crashlytics/Models/FIRCLSInternalReport.h"#import "Crashlytics/Crashlytics/Models/FIRCLSSymbolResolver.h"#import "Crashlytics/Crashlytics/Operations/Symbolication/FIRCLSDemangleOperation.h"#import "Crashlytics/Crashlytics/Operations/Symbolication/FIRCLSSerializeSymbolicatedFramesOperation.h"#import "Crashlytics/Crashlytics/Operations/Symbolication/FIRCLSSymbolicationOperation.h"#import "Crashlytics/Crashlytics/Private/FIRStackFrame_Private.h"@implementation FIRCLSProcessReportOperation- (instancetype)initWithReport:(FIRCLSInternalReport *)reportresolver:(FIRCLSSymbolResolver *)resolver {self = [super init];if (!self) {return nil;}_report = report;_symbolResolver = resolver;return self;}- (NSString *)binaryImagePath {return self.report.binaryImagePath;}- (NSArray *)threadArrayFromFile:(NSString *)path {NSArray *threads =FIRCLSFileReadSections([path fileSystemRepresentation], false, ^NSObject *(id obj) {// use this to select out the one entry that has a "threads" top-level entryreturn [obj objectForKey:@"threads"];});if ([threads count] == 0) {return nil;}// threads is actually an array of arraysthreads = [threads objectAtIndex:0];if (!threads) {return nil;}NSMutableArray *threadArray = [NSMutableArray array];for (NSDictionary *threadDetails in threads) {NSMutableArray *frameArray = [NSMutableArray array];for (NSNumber *pc in [threadDetails objectForKey:@"stacktrace"]) {FIRStackFrame *frame = [FIRStackFrame stackFrameWithAddress:[pc unsignedIntegerValue]];[frameArray addObject:frame];}[threadArray addObject:frameArray];}return threadArray;}- (BOOL)symbolicateFile:(NSString *)path withResolver:(FIRCLSSymbolResolver *)resolver {NSArray *threadArray = [self threadArrayFromFile:path];if (!threadArray) {return NO;}FIRCLSSymbolicationOperation *symbolicationOp = [[FIRCLSSymbolicationOperation alloc] init];[symbolicationOp setThreadArray:threadArray];[symbolicationOp setSymbolResolver:resolver];FIRCLSDemangleOperation *demangleOp = [[FIRCLSDemangleOperation alloc] init];[demangleOp setThreadArray:threadArray];FIRCLSSerializeSymbolicatedFramesOperation *serializeOp =[[FIRCLSSerializeSymbolicatedFramesOperation alloc] init];[serializeOp setThreadArray:threadArray];[serializeOp setOutputPath:[path stringByAppendingPathExtension:@"symbolicated"]];[symbolicationOp start];[demangleOp start];[serializeOp start];return YES;}- (void)main {if (![self.symbolResolver loadBinaryImagesFromFile:self.binaryImagePath]) {return;}[self.report enumerateSymbolicatableFilesInContent:^(NSString *path) {[self symbolicateFile:path withResolver:self.symbolResolver];}];}@end