gpt4 book ai didi

xcode4.2 - Xcode 4.2/iOS 5 下控制台中没有异常堆栈跟踪吗?

转载 作者:行者123 更新时间:2023-12-03 06:11:15 26 4
gpt4 key购买 nike

在 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];
}

(事实证明它已经存在,可以执行 Flurry 操作,所以我只是添加了堆栈跟踪。)

这是启用它的位置(仅在声明处理程序的下面几行):

- (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 模拟器上运行时,它确实得到了控制。)

在 iPhone 上设置 NSExceptionHandlingMask 显然是不可能的。先决条件 ExceptionHandling.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;
}

最佳答案

这有效:

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 不起作用。然而,显然这个问题只影响模拟器。

更新:

有人指出,如果您转到“产品”->“方案”->“编辑方案”,选择“运行(调试)”,选择“诊断”选项卡,然后单击“记录异常”,这将恢复丢失的 Xcode默认异常日志记录,可能(我还没有尝试过)消除了对上述黑客的需要。

关于xcode4.2 - Xcode 4.2/iOS 5 下控制台中没有异常堆栈跟踪吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8100054/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com