亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Xcode 4.2/IOS 5下控制臺中的堆棧跟蹤沒有異常嗎?

Xcode 4.2/IOS 5下控制臺中的堆棧跟蹤沒有異常嗎?

料青山看我應如是 2019-07-05 14:59:28
Xcode 4.2/IOS 5下控制臺中的堆棧跟蹤沒有異常嗎?在Xcode 3.x和IOS 4下,如果在模擬器中發出未處理異常信號,控制臺輸出中會產生異常堆棧跟蹤(類似于Java)。當我在Xcode 4.2下的IOS 5中引發一個未處理的異常,運行完全相同的應用程序代碼時,堆棧跟蹤不會發生。(我確實知道了如何設置異常斷點,但這不會在控制臺中產生回溯。)這僅僅是我需要在某個地方創建的Xcode設置,還是Xcode 4/IOS 5的“特性”?有什么辦法恢復這個功能嗎?更新不幸的是,添加一個uncaughtExceptionHandler不管用。下面是處理程序:void uncaughtExceptionHandler(NSException *exception) {     NSLog(@"uncaughtExceptionHnadler -- Exception %@", [exception description]);     // Because iOS 5 doesn't provide a traceback, provide one here     NSLog(@"Stack trace: %@", [exception callStackSymbols]);     // Let Flurry look at the error     [FlurryAPI logError:@"Uncaught" message:@"Crash!" exception:exception]; }(原來它已經存在了,所以我只是添加了堆棧跟蹤。)這里是啟用它的地方(僅在聲明處理程序的下面幾行):- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {     // Enable uncaught exception handler to dump stack and let Flurry log the exception     NSUncaughtExceptionHandler* hdlr = NSGetUncaughtExceptionHandler();     NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler);     NSUncaughtExceptionHandler* newHdlr = NSGetUncaughtExceptionHandler();     // TODO: Test     NSException* ex = [NSException exceptionWithName:@"AssertionFailure" reason:@"Test" userInfo:nil];      @throw ex;我設置斷點以使我能夠檢查兩個檢索到的處理程序值。第一個地址是零,第二個地址是明顯有效的地址。但是當拋出測試異常時,處理程序(在iOS 5模擬器中)永遠得不到控制。(不過,當我在iOS 4.2模擬器上運行時,它確實得到了控制。)設置NSExceptionHandlingMask顯然在iPhone上是不可能的。預qExceptionHandling.framework是不可用的。更新2這樣做是可行的:int main(int argc, char *argv[]) {     NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];     int retVal = -1;     @try {         retVal = UIApplicationMain(argc, argv, nil, nil);     }     @catch (NSException* exception) {         NSLog(@"Uncaught exception: %@", exception.description);         NSLog(@"Stack trace: %@", [exception callStackSymbols]);     }     [pool release];     return retVal; }
查看完整描述

3 回答

?
肥皂起泡泡

TA貢獻1829條經驗 獲得超6個贊

這樣做是可行的:

int main(int argc, char *argv[]) {

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    int retVal = -1;
    @try {
        retVal = UIApplicationMain(argc, argv, nil, nil);
    }
    @catch (NSException* exception) {
        NSLog(@"Uncaught exception: %@", exception.description);
        NSLog(@"Stack trace: %@", [exception callStackSymbols]);
    }
    [pool release];
    return retVal;
}

對于ARC:

int main(int argc, char *argv[]) {

    int retVal = -1;
    @autoreleasepool {
        @try {
            retVal = UIApplicationMain(argc, argv, nil, nil);
        }
        @catch (NSException* exception) {
            NSLog(@"Uncaught exception: %@", exception.description);
            NSLog(@"Stack trace: %@", [exception callStackSymbols]);
        }
    }
    return retVal;
}

仍然在等待某種解釋,解釋為什么默認轉儲不再工作和/或為什么(更嚴重的)uncaughtExceptionHandler不能工作。但是,顯然這個問題只影響模擬器。

最新情況:

已經指出,如果您轉到Product->Scheme->Edit Scheme,選擇“run(Debug)”,選擇“Diagnotics”選項卡,然后單擊“LogExceptions”,這將恢復缺少的Xcode默認異常日志記錄,可能(我還沒有嘗試過)消除了上述攻擊的需要。


查看完整回答
反對 回復 2019-07-05
?
侃侃爾雅

TA貢獻1801條經驗 獲得超16個贊

這是一個已知的問題.。關于解決辦法,請參閱這里這里.

另一種選擇可能是

defaults write NSGlobalDomain NSExceptionHandlingMask 63

雖然它通常用于OSX,但在使用模擬器時可能會有所幫助-但我現在無法嘗試它:-(


查看完整回答
反對 回復 2019-07-05
?
心有法竹

TA貢獻1866條經驗 獲得超5個贊

我有同樣的問題,打開“拇指編譯”回到我的工作。注意:出于明顯的原因,我只為調試配置打開了它。


查看完整回答
反對 回復 2019-07-05
  • 3 回答
  • 0 關注
  • 659 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號