2015-07-09 78 views
0

我是Swift的新手。在Swift崩潰的情況下轉儲堆棧和異常

當我有一個很艱難的漏洞破解上Objective-C我一般像這樣的東西取代我main.m文件:

int main(int argc, char *argv[]) { 
    int retVal; 
    @autoreleasepool { 
    @try { 
     retVal = UIApplicationMain(argc, argv, nil, nil); //*** 
    } 
    @catch (NSException *exception) { 
     NSLog(@"\n\nSTACK SYMBOLS\n%@",[exception callStackSymbols]); 
     NSLog(@"\n\nSTACK RETURN ADDRESSES\n%@", 
        [exception callStackReturnAddresses]); 
     NSLog(@"\n\nOBJECT: %@",[exception name]); 
     NSLog(@"\n\nUSER INFO DICT: %@",[exception userInfo]); 
     NSLog(@"\n\nREASON: %@",[exception reason]); 
     retVal = 1; 
    } 
    } 
    return retVal; 
} 

這將有助於收集有關崩潰的信息。

當應用程序崩潰時,代碼將轉儲堆棧,返回地址和大量幫助識別違規行的信息。

有沒有這樣的事情可以做Swift

+0

更新您的問題與您試圖轉換迅速。 – rmaddy

回答

1

在純Swift中沒有這種模式的真實等價物,因爲在Swift中沒有等效於@try。 (Swift2的try在使用和實現方面是不相關和根本不同的。)

也就是說,有一種方法可以覆蓋程序啓動。從Programming Guide

UIApplicationMain

應用此屬性的一類,表明它是應用程序委託。使用此屬性相當於調用UIApplicationMain函數並將此類的名稱作爲委託類的名稱傳遞。

如果您不使用此屬性,請提供一個main.swift文件,其中包含一個調用UIApplicationMain(_:_:_:)函數的主函數。例如,如果您的應用程序使用UIApplication的自定義子類作爲其主類,請調用UIApplicationMain(_:_:_:)函數而不是使用此屬性。

因此,您可以從應用程序委託中刪除UIApplicationMain,然後按照說明創建swift.main文件。但你不能在那裏發現異常。

但是,你當然可以在ObjC中使用你的上述main.m,它也會以同樣的方式工作。只需刪除UIApplicationMain屬性即可。

(大多數的你在做什麼這裏看起來非常相似,你從崩潰堆得到什麼正常。這是否真的給你一個標準的崩潰報告更好的信息?)

+1

有時候會。當Xcode不能解釋這個問題時,我會使用它,有時它通過給我一些東西來幫助識別問題。謝謝。 – SpaceDog

相關問題