1. 程式人生 > >ios 無法看到崩潰日誌

ios 無法看到崩潰日誌

最近在除錯應用的時候發現了一個問題, 就是Xcode的控制檯不列印Crash日誌. 幾經周折終於發現了問題.

因為不能列印日誌, 開始以為是我沒有設定 NSSetUncaughtExceptionHandler 這個崩潰日誌方法於是乎在appDelegate.m新增如下程式碼:

void uncaughtExceptionHandler(NSException *exception) {
    NSLog(@"CRASH: %@", exception);
    NSLog(@"Stack Trace: %@", [exception callStackSymbols]);
    // Internal error reporting
} - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler); // Normal launch stuff }

結果還是一樣控制檯還是隻列印了這句話的錯誤資訊: libc++abi.dylib: terminate_handler unexpectedly threw an exception

 還是與事無補.

於是繼續尋找原因, 最終在每行程式碼塊都註釋的方式來排除問題,最終鎖定了問題, 因為我引用了AvosCloud的後臺SDK, 它預設開啟了將崩潰日誌上傳的功能, 但是他沒有列印本地的崩潰日誌, 最後一段程式碼解決了這個問題.

[AVAnalytics setCrashReportEnabled:NO];

這裡不得不得吐槽一下官方的教程, 換了類名但是教程還是沒有及時更改, 害我找這個方法找了10分鐘.
[AVOSCloudCrashReporting enable];

還有比如友盟分析

 [MobClicksetCrashReportEnabled:NO];

總結

一般Xcode不輸出Crash日誌有一下幾個可能:
1. NSSetUncaughtExceptionHandler() 可能被重寫了, 你呼叫之前它之後,(比如你引用了一些第三方庫, 它的SDK裡面可能包含了把Crash的日誌上傳到伺服器, 這樣這個日誌可能被重寫了, 就不列印本地的崩潰資訊了) 儘量把它放在didFinishLaunchingWithOptions 最後面的一行程式碼塊裡.

2. 還一種崩潰的情況是 EXC_BAD_ACCESS 當遇到這種錯誤, 控制一般不會給你很多關於崩潰的資訊, 這種崩潰你只能使用下面這個除錯方法, 不過記住你在正式釋出的時候記得把這個勾取消, 不然會造成一些嚴重的問題.

因為選擇了zombie以後所有oc物件都不會唄釋放.


螢幕快照 2015-08-01 下午9.25.44.png