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; }
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; }
最新情況:
- 3 回答
- 0 關注
- 659 瀏覽
添加回答
舉報
0/150
提交
取消