mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-12-16 19:30:29 +00:00
Further improved image type detection
Fixes a few more issues with detecting the image type in crash reports
This commit is contained in:
parent
f018440021
commit
6e87975b41
@ -44,11 +44,31 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* HockeySDK Crash Reporter error domain
|
||||||
|
*/
|
||||||
|
typedef NS_ENUM (NSInteger, BITBinaryImageType) {
|
||||||
|
/**
|
||||||
|
* App binary
|
||||||
|
*/
|
||||||
|
BITBinaryImageTypeAppBinary,
|
||||||
|
/**
|
||||||
|
* App provided framework
|
||||||
|
*/
|
||||||
|
BITBinaryImageTypeAppFramework,
|
||||||
|
/**
|
||||||
|
* Image not related to the app
|
||||||
|
*/
|
||||||
|
BITBinaryImageTypeOther
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
@interface BITCrashReportTextFormatter : NSObject {
|
@interface BITCrashReportTextFormatter : NSObject {
|
||||||
}
|
}
|
||||||
|
|
||||||
+ (NSString *)stringValueForCrashReport:(PLCrashReport *)report crashReporterKey:(NSString *)crashReporterKey;
|
+ (NSString *)stringValueForCrashReport:(PLCrashReport *)report crashReporterKey:(NSString *)crashReporterKey;
|
||||||
+ (NSArray *)arrayOfAppUUIDsForCrashReport:(PLCrashReport *)report;
|
+ (NSArray *)arrayOfAppUUIDsForCrashReport:(PLCrashReport *)report;
|
||||||
+ (NSString *)bit_archNameFromCPUType:(uint64_t)cpuType subType:(uint64_t)subType;
|
+ (NSString *)bit_archNameFromCPUType:(uint64_t)cpuType subType:(uint64_t)subType;
|
||||||
|
+ (BITBinaryImageType)bit_imageTypeForImagePath:(NSString *)imagePath processPath:(NSString *)processPath;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|||||||
@ -536,14 +536,9 @@ static const char *findSEL (const char *imageName, NSString *imageUUID, uint64_t
|
|||||||
|
|
||||||
/* Determine if this is the main executable or an app specific framework*/
|
/* Determine if this is the main executable or an app specific framework*/
|
||||||
NSString *binaryDesignator = @" ";
|
NSString *binaryDesignator = @" ";
|
||||||
NSString *imagePath = [imageInfo.imageName stringByStandardizingPath];
|
BITBinaryImageType imageType = [[self class] bit_imageTypeForImagePath:imageInfo.imageName
|
||||||
NSString *appBundleContentsPath = [[report.processInfo.processPath stringByDeletingLastPathComponent] stringByDeletingLastPathComponent];
|
processPath:report.processInfo.processPath];
|
||||||
|
if (imageType != BITBinaryImageTypeOther) {
|
||||||
// exclude iOS swift dylibs
|
|
||||||
if ([imageInfo.imageName rangeOfString:@".app/Frameworks/libswift"].location == NSNotFound) {
|
|
||||||
if ([imagePath isEqual: report.processInfo.processPath] ||
|
|
||||||
[imagePath hasPrefix:appBundleContentsPath] ||
|
|
||||||
[imageInfo.imageName hasPrefix:appBundleContentsPath]) // Fix issue with iOS 8 `stringByStandardizingPath` removing leading `/private` path (when not running in the debugger only)
|
|
||||||
binaryDesignator = @"+";
|
binaryDesignator = @"+";
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -635,27 +630,60 @@ static const char *findSEL (const char *imageName, NSString *imageUUID, uint64_t
|
|||||||
|
|
||||||
/* Determine the architecture string */
|
/* Determine the architecture string */
|
||||||
NSString *archName = [[self class] bit_archNameFromImageInfo:imageInfo];
|
NSString *archName = [[self class] bit_archNameFromImageInfo:imageInfo];
|
||||||
|
|
||||||
/* Determine if this is the app executable or app specific framework */
|
/* Determine if this is the app executable or app specific framework */
|
||||||
NSString *imagePath = [imageInfo.imageName stringByStandardizingPath];
|
BITBinaryImageType imageType = [[self class] bit_imageTypeForImagePath:imageInfo.imageName
|
||||||
NSString *appBundleContentsPath = [[report.processInfo.processPath stringByDeletingLastPathComponent] stringByDeletingLastPathComponent];
|
processPath:report.processInfo.processPath];
|
||||||
NSString *imageType = @"";
|
NSString *imageTypeString = @"";
|
||||||
|
|
||||||
if ([imageInfo.imageName isEqual: report.processInfo.processPath]) {
|
if (imageType != BITBinaryImageTypeOther) {
|
||||||
imageType = @"app";
|
if (imageType == BITBinaryImageTypeAppBinary) {
|
||||||
} else {
|
imageTypeString = @"app";
|
||||||
imageType = @"framework";
|
} else {
|
||||||
}
|
imageTypeString = @"framework";
|
||||||
|
}
|
||||||
if ([imagePath isEqual: report.processInfo.processPath] || [imagePath hasPrefix:appBundleContentsPath]) {
|
|
||||||
[appUUIDs addObject:@{kBITBinaryImageKeyUUID: uuid, kBITBinaryImageKeyArch: archName, kBITBinaryImageKeyType: imageType}];
|
[appUUIDs addObject:@{kBITBinaryImageKeyUUID: uuid,
|
||||||
|
kBITBinaryImageKeyArch: archName,
|
||||||
|
kBITBinaryImageKeyType: imageTypeString}
|
||||||
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
return appUUIDs;
|
return appUUIDs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Determine if in binary image is the app executable or app specific framework */
|
||||||
|
+ (BITBinaryImageType)bit_imageTypeForImagePath:(NSString *)imagePath processPath:(NSString *)processPath {
|
||||||
|
BITBinaryImageType imageType = BITBinaryImageTypeOther;
|
||||||
|
|
||||||
|
NSString *standardizedImagePath = [[imagePath stringByStandardizingPath] lowercaseString];
|
||||||
|
imagePath = [imagePath lowercaseString];
|
||||||
|
processPath = [processPath lowercaseString];
|
||||||
|
|
||||||
|
NSRange appRange = [standardizedImagePath rangeOfString: @".app/"];
|
||||||
|
|
||||||
|
// Exclude iOS swift dylibs. These are provided as part of the app binary by Xcode for now, but we never get a dSYM for those.
|
||||||
|
NSRange swiftLibRange = [standardizedImagePath rangeOfString:@"frameworks/libswift"];
|
||||||
|
BOOL dylibSuffix = [standardizedImagePath hasSuffix:@".dylib"];
|
||||||
|
|
||||||
|
if (appRange.location != NSNotFound && !(swiftLibRange.location != NSNotFound && dylibSuffix)) {
|
||||||
|
NSString *appBundleContentsPath = [standardizedImagePath substringToIndex:appRange.location + 5];
|
||||||
|
|
||||||
|
if ([standardizedImagePath isEqual: processPath] ||
|
||||||
|
// Fix issue with iOS 8 `stringByStandardizingPath` removing leading `/private` path (when not running in the debugger or simulator only)
|
||||||
|
[imagePath hasPrefix:processPath]) {
|
||||||
|
imageType = BITBinaryImageTypeAppBinary;
|
||||||
|
} else if ([standardizedImagePath hasPrefix:appBundleContentsPath] ||
|
||||||
|
// Fix issue with iOS 8 `stringByStandardizingPath` removing leading `/private` path (when not running in the debugger or simulator only)
|
||||||
|
[imagePath hasPrefix:appBundleContentsPath]) {
|
||||||
|
imageType = BITBinaryImageTypeAppFramework;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return imageType;
|
||||||
|
}
|
||||||
|
|
||||||
+ (NSString *)bit_archNameFromImageInfo:(BITPLCrashReportBinaryImageInfo *)imageInfo
|
+ (NSString *)bit_archNameFromImageInfo:(BITPLCrashReportBinaryImageInfo *)imageInfo
|
||||||
{
|
{
|
||||||
NSString *archName = @"???";
|
NSString *archName = @"???";
|
||||||
@ -778,12 +806,9 @@ static const char *findSEL (const char *imageName, NSString *imageUUID, uint64_t
|
|||||||
|
|
||||||
/* If symbol info is available, the format used in Apple's reports is Sym + OffsetFromSym. Otherwise,
|
/* If symbol info is available, the format used in Apple's reports is Sym + OffsetFromSym. Otherwise,
|
||||||
* the format used is imageBaseAddress + offsetToIP */
|
* the format used is imageBaseAddress + offsetToIP */
|
||||||
NSString *imagePath = [imageInfo.imageName stringByStandardizingPath];
|
BITBinaryImageType imageType = [[self class] bit_imageTypeForImagePath:imageInfo.imageName
|
||||||
NSString *appBundleContentsPath = [[report.processInfo.processPath stringByDeletingLastPathComponent] stringByDeletingLastPathComponent];
|
processPath:report.processInfo.processPath];
|
||||||
|
if (frameInfo.symbolInfo != nil && imageType == BITBinaryImageTypeOther) {
|
||||||
if (frameInfo.symbolInfo != nil &&
|
|
||||||
![imagePath isEqual: report.processInfo.processPath] &&
|
|
||||||
![imagePath hasPrefix:appBundleContentsPath]) {
|
|
||||||
NSString *symbolName = frameInfo.symbolInfo.symbolName;
|
NSString *symbolName = frameInfo.symbolInfo.symbolName;
|
||||||
|
|
||||||
/* Apple strips the _ symbol prefix in their reports. Only OS X makes use of an
|
/* Apple strips the _ symbol prefix in their reports. Only OS X makes use of an
|
||||||
|
|||||||
@ -89,6 +89,7 @@
|
|||||||
1E4CD1EA19D17EB700019DD4 /* Ok@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 1E4CD1E919D17EB700019DD4 /* Ok@3x.png */; };
|
1E4CD1EA19D17EB700019DD4 /* Ok@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 1E4CD1E919D17EB700019DD4 /* Ok@3x.png */; };
|
||||||
1E4CD1EC19D17EBE00019DD4 /* Rectangle@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 1E4CD1EB19D17EBE00019DD4 /* Rectangle@3x.png */; };
|
1E4CD1EC19D17EBE00019DD4 /* Rectangle@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 1E4CD1EB19D17EBE00019DD4 /* Rectangle@3x.png */; };
|
||||||
1E4CD1F019D17EE400019DD4 /* authorize_denied@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 1E4CD1EF19D17EE400019DD4 /* authorize_denied@3x.png */; };
|
1E4CD1F019D17EE400019DD4 /* authorize_denied@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 1E4CD1EF19D17EE400019DD4 /* authorize_denied@3x.png */; };
|
||||||
|
1E566D071A275C4C0070F514 /* BITCrashReportTextFormatterTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E566D061A275C4C0070F514 /* BITCrashReportTextFormatterTests.m */; };
|
||||||
1E5954D315B6F24A00A03429 /* BITHockeyManager.m in Sources */ = {isa = PBXBuildFile; fileRef = E41EB466148D7BF50015DEDC /* BITHockeyManager.m */; };
|
1E5954D315B6F24A00A03429 /* BITHockeyManager.m in Sources */ = {isa = PBXBuildFile; fileRef = E41EB466148D7BF50015DEDC /* BITHockeyManager.m */; };
|
||||||
1E5954DC15B6F24A00A03429 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E400561D148D79B500EB22B9 /* Foundation.framework */; };
|
1E5954DC15B6F24A00A03429 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E400561D148D79B500EB22B9 /* Foundation.framework */; };
|
||||||
1E5954DD15B6F24A00A03429 /* CrashReporter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E41EB48B148D7C4E0015DEDC /* CrashReporter.framework */; };
|
1E5954DD15B6F24A00A03429 /* CrashReporter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E41EB48B148D7C4E0015DEDC /* CrashReporter.framework */; };
|
||||||
@ -279,6 +280,7 @@
|
|||||||
1E4CD1E919D17EB700019DD4 /* Ok@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Ok@3x.png"; sourceTree = "<group>"; };
|
1E4CD1E919D17EB700019DD4 /* Ok@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Ok@3x.png"; sourceTree = "<group>"; };
|
||||||
1E4CD1EB19D17EBE00019DD4 /* Rectangle@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Rectangle@3x.png"; sourceTree = "<group>"; };
|
1E4CD1EB19D17EBE00019DD4 /* Rectangle@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Rectangle@3x.png"; sourceTree = "<group>"; };
|
||||||
1E4CD1EF19D17EE400019DD4 /* authorize_denied@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "authorize_denied@3x.png"; sourceTree = "<group>"; };
|
1E4CD1EF19D17EE400019DD4 /* authorize_denied@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "authorize_denied@3x.png"; sourceTree = "<group>"; };
|
||||||
|
1E566D061A275C4C0070F514 /* BITCrashReportTextFormatterTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BITCrashReportTextFormatterTests.m; sourceTree = "<group>"; };
|
||||||
1E5954F215B6F24A00A03429 /* libHockeySDK.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libHockeySDK.a; sourceTree = BUILT_PRODUCTS_DIR; };
|
1E5954F215B6F24A00A03429 /* libHockeySDK.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libHockeySDK.a; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
1E59550A15B6F45800A03429 /* HockeySDKResources.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = HockeySDKResources.bundle; sourceTree = BUILT_PRODUCTS_DIR; };
|
1E59550A15B6F45800A03429 /* HockeySDKResources.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = HockeySDKResources.bundle; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
1E59556015B6F80E00A03429 /* de */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/HockeySDK.strings; sourceTree = "<group>"; };
|
1E59556015B6F80E00A03429 /* de */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/HockeySDK.strings; sourceTree = "<group>"; };
|
||||||
@ -490,6 +492,7 @@
|
|||||||
E40E0B0817DA19DC005E38C1 /* BITHockeyAppClientTests.m */,
|
E40E0B0817DA19DC005E38C1 /* BITHockeyAppClientTests.m */,
|
||||||
E4507E4217F0658F00171A0D /* BITKeychainUtilsTests.m */,
|
E4507E4217F0658F00171A0D /* BITKeychainUtilsTests.m */,
|
||||||
1E70A23517F31B82001BB32D /* BITHockeyHelperTests.m */,
|
1E70A23517F31B82001BB32D /* BITHockeyHelperTests.m */,
|
||||||
|
1E566D061A275C4C0070F514 /* BITCrashReportTextFormatterTests.m */,
|
||||||
);
|
);
|
||||||
path = HockeySDKTests;
|
path = HockeySDKTests;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
@ -1097,6 +1100,7 @@
|
|||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
1E5A459E16F0DFC200B55C04 /* BITStoreUpdateManagerTests.m in Sources */,
|
1E5A459E16F0DFC200B55C04 /* BITStoreUpdateManagerTests.m in Sources */,
|
||||||
|
1E566D071A275C4C0070F514 /* BITCrashReportTextFormatterTests.m in Sources */,
|
||||||
1EFF03E517F2485500A5F13C /* BITCrashManagerTests.m in Sources */,
|
1EFF03E517F2485500A5F13C /* BITCrashManagerTests.m in Sources */,
|
||||||
E40E0B0917DA19DC005E38C1 /* BITHockeyAppClientTests.m in Sources */,
|
E40E0B0917DA19DC005E38C1 /* BITHockeyAppClientTests.m in Sources */,
|
||||||
1E70A23617F31B82001BB32D /* BITHockeyHelperTests.m in Sources */,
|
1E70A23617F31B82001BB32D /* BITHockeyHelperTests.m in Sources */,
|
||||||
|
|||||||
196
Support/HockeySDKTests/BITCrashReportTextFormatterTests.m
Normal file
196
Support/HockeySDKTests/BITCrashReportTextFormatterTests.m
Normal file
@ -0,0 +1,196 @@
|
|||||||
|
//
|
||||||
|
// BITCrashReportTextFormatterTests.m
|
||||||
|
// HockeySDK
|
||||||
|
//
|
||||||
|
// Created by Andreas Linde on 27.11.14.
|
||||||
|
//
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <XCTest/XCTest.h>
|
||||||
|
#import "BITCrashReportTextFormatter.h"
|
||||||
|
|
||||||
|
@interface BITCrashReportTextFormatterTests : XCTestCase
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
||||||
|
@implementation BITCrashReportTextFormatterTests
|
||||||
|
|
||||||
|
- (void)setUp {
|
||||||
|
[super setUp];
|
||||||
|
// Put setup code here. This method is called before the invocation of each test method in the class.
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)tearDown {
|
||||||
|
# pragma clang diagnostic push
|
||||||
|
# pragma clang diagnostic ignored "-Wimplicit"
|
||||||
|
__gcov_flush();
|
||||||
|
# pragma clang diagnostic pop
|
||||||
|
|
||||||
|
[super tearDown];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)testOSXImages {
|
||||||
|
NSString *processPath = nil;
|
||||||
|
NSString *appBundlePath = nil;
|
||||||
|
|
||||||
|
appBundlePath = @"/Applications/MyTestApp.App";
|
||||||
|
|
||||||
|
// Test with default OS X app path
|
||||||
|
processPath = [appBundlePath stringByAppendingString:@"/Contents/MacOS/MyApp"];
|
||||||
|
[self testOSXNonAppSpecificImagesForProcessPath:processPath];
|
||||||
|
[self testAppBinaryWithImagePath:processPath processPath:processPath];
|
||||||
|
|
||||||
|
// Test with OS X LoginItems app helper path
|
||||||
|
processPath = [appBundlePath stringByAppendingString:@"/Contents/Library/LoginItems/net.hockeyapp.helper.app/Contents/MacOS/Helper"];
|
||||||
|
[self testOSXNonAppSpecificImagesForProcessPath:processPath];
|
||||||
|
[self testAppBinaryWithImagePath:processPath processPath:processPath];
|
||||||
|
|
||||||
|
// Test with OS X app in Resources folder
|
||||||
|
processPath = @"/Applications/MyTestApp.App/Contents/Resources/Helper";
|
||||||
|
[self testOSXNonAppSpecificImagesForProcessPath:processPath];
|
||||||
|
[self testAppBinaryWithImagePath:processPath processPath:processPath];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)testiOSImages {
|
||||||
|
NSString *processPath = nil;
|
||||||
|
NSString *appBundlePath = nil;
|
||||||
|
|
||||||
|
appBundlePath = @"/private/var/mobile/Containers/Bundle/Application/9107B4E2-CD8C-486E-A3B2-82A5B818F2A0/MyApp.app";
|
||||||
|
|
||||||
|
// Test with iOS App
|
||||||
|
processPath = [appBundlePath stringByAppendingString:@"/MyApp"];
|
||||||
|
[self testiOSNonAppSpecificImagesForProcessPath:processPath];
|
||||||
|
[self testAppBinaryWithImagePath:processPath processPath:processPath];
|
||||||
|
[self testiOSAppFrameworkAtProcessPath:processPath appBundlePath:appBundlePath];
|
||||||
|
|
||||||
|
// Test with iOS App Extension
|
||||||
|
processPath = [appBundlePath stringByAppendingString:@"/Plugins/MyAppExtension.appex/MyAppExtension"];
|
||||||
|
[self testiOSNonAppSpecificImagesForProcessPath:processPath];
|
||||||
|
[self testAppBinaryWithImagePath:processPath processPath:processPath];
|
||||||
|
[self testiOSAppFrameworkAtProcessPath:processPath appBundlePath:appBundlePath];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#pragma mark - Test Helper
|
||||||
|
|
||||||
|
- (void)testAppBinaryWithImagePath:(NSString *)imagePath processPath:(NSString *)processPath {
|
||||||
|
BITBinaryImageType imageType = [BITCrashReportTextFormatter bit_imageTypeForImagePath:imagePath
|
||||||
|
processPath:processPath];
|
||||||
|
XCTAssert((imageType == BITBinaryImageTypeAppBinary), @"Test app %@ with process %@", imagePath, processPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#pragma mark - OS X Test Helper
|
||||||
|
|
||||||
|
- (void)testOSXAppFrameworkAtProcessPath:(NSString *)processPath appBundlePath:(NSString *)appBundlePath {
|
||||||
|
NSString *frameworkPath = [appBundlePath stringByAppendingString:@"/Contents/Frameworks/MyFrameworkLib.framework/Versions/A/MyFrameworkLib"];
|
||||||
|
BITBinaryImageType imageType = [BITCrashReportTextFormatter bit_imageTypeForImagePath:frameworkPath
|
||||||
|
processPath:processPath];
|
||||||
|
XCTAssert((imageType == BITBinaryImageTypeAppFramework), @"Test framework %@ with process %@", frameworkPath, processPath);
|
||||||
|
|
||||||
|
frameworkPath = [appBundlePath stringByAppendingString:@"/Contents/Frameworks/libSwiftMyLib.framework/Versions/A/libSwiftMyLib"];
|
||||||
|
imageType = [BITCrashReportTextFormatter bit_imageTypeForImagePath:frameworkPath
|
||||||
|
processPath:processPath];
|
||||||
|
XCTAssert((imageType == BITBinaryImageTypeAppFramework), @"Test framework %@ with process %@", frameworkPath, processPath);
|
||||||
|
|
||||||
|
NSMutableArray *swiftFrameworkPaths = [NSMutableArray new];
|
||||||
|
[swiftFrameworkPaths addObject:[appBundlePath stringByAppendingString:@"/Contents/Frameworks/libswiftCore.dylib"]];
|
||||||
|
[swiftFrameworkPaths addObject:[appBundlePath stringByAppendingString:@"/Contents/Frameworks/libswiftDarwin.dylib"]];
|
||||||
|
[swiftFrameworkPaths addObject:[appBundlePath stringByAppendingString:@"/Contents/Frameworks/libswiftDispatch.dylib"]];
|
||||||
|
[swiftFrameworkPaths addObject:[appBundlePath stringByAppendingString:@"/Contents/Frameworks/libswiftFoundation.dylib"]];
|
||||||
|
[swiftFrameworkPaths addObject:[appBundlePath stringByAppendingString:@"/Contents/Frameworks/libswiftObjectiveC.dylib"]];
|
||||||
|
[swiftFrameworkPaths addObject:[appBundlePath stringByAppendingString:@"/Contents/Frameworks/libswiftSecurity.dylib"]];
|
||||||
|
[swiftFrameworkPaths addObject:[appBundlePath stringByAppendingString:@"/Contents/Frameworks/libswiftCoreGraphics.dylib"]];
|
||||||
|
|
||||||
|
for (NSString *imagePath in swiftFrameworkPaths) {
|
||||||
|
BITBinaryImageType imageType = [BITCrashReportTextFormatter bit_imageTypeForImagePath:imagePath
|
||||||
|
processPath:processPath];
|
||||||
|
XCTAssert((imageType == BITBinaryImageTypeOther), @"Test swift image %@ with process %@", imagePath, processPath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)testOSXNonAppSpecificImagesForProcessPath:(NSString *)processPath {
|
||||||
|
// system test paths
|
||||||
|
NSMutableArray *nonAppSpecificImagePaths = [NSMutableArray new];
|
||||||
|
|
||||||
|
// OS X frameworks
|
||||||
|
[nonAppSpecificImagePaths addObject:@"cl_kernels"];
|
||||||
|
[nonAppSpecificImagePaths addObject:@""];
|
||||||
|
[nonAppSpecificImagePaths addObject:@"???"];
|
||||||
|
[nonAppSpecificImagePaths addObject:@"/System/Library/Frameworks/CFNetwork.framework/Versions/A/CFNetwork"];
|
||||||
|
[nonAppSpecificImagePaths addObject:@"/usr/lib/system/libsystem_platform.dylib"];
|
||||||
|
[nonAppSpecificImagePaths addObject:@"/System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/vecLib"];
|
||||||
|
[nonAppSpecificImagePaths addObject:@"/System/Library/PrivateFrameworks/Sharing.framework/Versions/A/Sharing"];
|
||||||
|
[nonAppSpecificImagePaths addObject:@"/usr/lib/libbsm.0.dylib"];
|
||||||
|
|
||||||
|
for (NSString *imagePath in nonAppSpecificImagePaths) {
|
||||||
|
BITBinaryImageType imageType = [BITCrashReportTextFormatter bit_imageTypeForImagePath:imagePath
|
||||||
|
processPath:processPath];
|
||||||
|
XCTAssert((imageType == BITBinaryImageTypeOther), @"Test other image %@ with process %@", imagePath, processPath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#pragma mark - iOS Test Helper
|
||||||
|
|
||||||
|
- (void)testiOSAppFrameworkAtProcessPath:(NSString *)processPath appBundlePath:(NSString *)appBundlePath {
|
||||||
|
NSString *frameworkPath = [appBundlePath stringByAppendingString:@"/Frameworks/MyFrameworkLib.framework/MyFrameworkLib"];
|
||||||
|
BITBinaryImageType imageType = [BITCrashReportTextFormatter bit_imageTypeForImagePath:frameworkPath
|
||||||
|
processPath:processPath];
|
||||||
|
XCTAssert((imageType == BITBinaryImageTypeAppFramework), @"Test framework %@ with process %@", frameworkPath, processPath);
|
||||||
|
|
||||||
|
frameworkPath = [appBundlePath stringByAppendingString:@"/Frameworks/libSwiftMyLib.framework/libSwiftMyLib"];
|
||||||
|
imageType = [BITCrashReportTextFormatter bit_imageTypeForImagePath:frameworkPath
|
||||||
|
processPath:processPath];
|
||||||
|
XCTAssert((imageType == BITBinaryImageTypeAppFramework), @"Test framework %@ with process %@", frameworkPath, processPath);
|
||||||
|
|
||||||
|
NSMutableArray *swiftFrameworkPaths = [NSMutableArray new];
|
||||||
|
[swiftFrameworkPaths addObject:[appBundlePath stringByAppendingString:@"/Frameworks/libswiftCore.dylib"]];
|
||||||
|
[swiftFrameworkPaths addObject:[appBundlePath stringByAppendingString:@"/Frameworks/libswiftDarwin.dylib"]];
|
||||||
|
[swiftFrameworkPaths addObject:[appBundlePath stringByAppendingString:@"/Frameworks/libswiftDispatch.dylib"]];
|
||||||
|
[swiftFrameworkPaths addObject:[appBundlePath stringByAppendingString:@"/Frameworks/libswiftFoundation.dylib"]];
|
||||||
|
[swiftFrameworkPaths addObject:[appBundlePath stringByAppendingString:@"/Frameworks/libswiftObjectiveC.dylib"]];
|
||||||
|
[swiftFrameworkPaths addObject:[appBundlePath stringByAppendingString:@"/Frameworks/libswiftSecurity.dylib"]];
|
||||||
|
[swiftFrameworkPaths addObject:[appBundlePath stringByAppendingString:@"/Frameworks/libswiftCoreGraphics.dylib"]];
|
||||||
|
|
||||||
|
for (NSString *imagePath in swiftFrameworkPaths) {
|
||||||
|
BITBinaryImageType imageType = [BITCrashReportTextFormatter bit_imageTypeForImagePath:imagePath
|
||||||
|
processPath:processPath];
|
||||||
|
XCTAssert((imageType == BITBinaryImageTypeOther), @"Test swift image %@ with process %@", imagePath, processPath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)testiOSNonAppSpecificImagesForProcessPath:(NSString *)processPath {
|
||||||
|
// system test paths
|
||||||
|
NSMutableArray *nonAppSpecificImagePaths = [NSMutableArray new];
|
||||||
|
|
||||||
|
// iOS frameworks
|
||||||
|
[nonAppSpecificImagePaths addObject:@"/System/Library/AccessibilityBundles/AccessibilitySettingsLoader.bundle/AccessibilitySettingsLoader"];
|
||||||
|
[nonAppSpecificImagePaths addObject:@"/System/Library/Frameworks/AVFoundation.framework/AVFoundation"];
|
||||||
|
[nonAppSpecificImagePaths addObject:@"/System/Library/Frameworks/AVFoundation.framework/libAVFAudio.dylib"];
|
||||||
|
[nonAppSpecificImagePaths addObject:@"/System/Library/PrivateFrameworks/AOSNotification.framework/AOSNotification"];
|
||||||
|
[nonAppSpecificImagePaths addObject:@"/System/Library/PrivateFrameworks/Accessibility.framework/Frameworks/AccessibilityUI.framework/AccessibilityUI"];
|
||||||
|
[nonAppSpecificImagePaths addObject:@"/System/Library/PrivateFrameworks/Accessibility.framework/Frameworks/AccessibilityUIUtilities.framework/AccessibilityUIUtilities"];
|
||||||
|
[nonAppSpecificImagePaths addObject:@"/usr/lib/libAXSafeCategoryBundle.dylib"];
|
||||||
|
[nonAppSpecificImagePaths addObject:@"/usr/lib/libAXSpeechManager.dylib"];
|
||||||
|
[nonAppSpecificImagePaths addObject:@"/usr/lib/libAccessibility.dylib"];
|
||||||
|
[nonAppSpecificImagePaths addObject:@"/usr/lib/system/libcache.dylib"];
|
||||||
|
[nonAppSpecificImagePaths addObject:@"/usr/lib/system/libcommonCrypto.dylib"];
|
||||||
|
[nonAppSpecificImagePaths addObject:@"/usr/lib/system/libcompiler_rt.dylib"];
|
||||||
|
|
||||||
|
// iOS Jailbreak libraries
|
||||||
|
[nonAppSpecificImagePaths addObject:@"/Library/MobileSubstrate/MobileSubstrate.dylib"];
|
||||||
|
[nonAppSpecificImagePaths addObject:@"/Library/MobileSubstrate/DynamicLibraries/WeeLoader.dylib"];
|
||||||
|
[nonAppSpecificImagePaths addObject:@"/Library/Frameworks/CydiaSubstrate.framework/Libraries/SubstrateLoader.dylib"];
|
||||||
|
[nonAppSpecificImagePaths addObject:@"/Library/Frameworks/CydiaSubstrate.framework/CydiaSubstrate"];
|
||||||
|
[nonAppSpecificImagePaths addObject:@"/Library/MobileSubstrate/DynamicLibraries/WinterBoard.dylib"];
|
||||||
|
|
||||||
|
for (NSString *imagePath in nonAppSpecificImagePaths) {
|
||||||
|
BITBinaryImageType imageType = [BITCrashReportTextFormatter bit_imageTypeForImagePath:imagePath
|
||||||
|
processPath:processPath];
|
||||||
|
XCTAssert((imageType == BITBinaryImageTypeOther), @"Test other image %@ with process %@", imagePath, processPath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@end
|
||||||
Loading…
x
Reference in New Issue
Block a user