嘿,这可能是一个愚蠢的问题,但我无法在任何地方找到答案,如果答案很容易找到并且我的研究技巧是裤子,我会道歉。
无论如何,当应用程序没有崩溃时,是否可以生成崩溃报告?所以说如果用户遇到错误,可以选择允许他们生成崩溃报告,然后发送给我吗?我怎么会这样做?
感谢您的帮助:)
答案 0 :(得分:5)
当我不得不打印堆栈跟踪时,我已经使用了几次:
+ (NSArray *)backtrace
{
void* callstack[128];
int frames = backtrace(callstack, 128);
char **strs = backtrace_symbols(callstack, frames);
int i;
NSMutableArray *backtrace = [NSMutableArray arrayWithCapacity:frames];
for (
i = UncaughtExceptionHandlerSkipAddressCount;
i < UncaughtExceptionHandlerSkipAddressCount +
UncaughtExceptionHandlerReportAddressCount;
i++)
{
[backtrace addObject:[NSString stringWithUTF8String:strs[i]]];
}
free(strs);
return backtrace;
}
“当应用程序在iPhone上崩溃时,它会在不告诉用户发生了什么的情况下消失。但是,可以向应用程序添加异常和信号处理,以便向用户显示错误消息或者您可以保存甚至可以尝试从这种情况中恢复而不会崩溃。“ 看http://cocoawithlove.com/2010/05/handling-unhandled-exceptions-and.html
答案 1 :(得分:3)
这是我用于堆栈跟踪的内容:
NSArray *callStackArray = [exception callStackReturnAddresses];
int frameCount = [callStackArray count];
void *backtraceFrames[frameCount];
for (int i=0; i < frameCount; i++) {
backtraceFrames[i] = (void *)[[callStackArray objectAtIndex:i] unsignedIntegerValue];
}
char **strs = backtrace_symbols(backtraceFrames, frameCount);
NSMutableArray *backtraceArray = [NSMutableArray arrayWithCapacity:frameCount];
for (int i = 0; i < frameCount; i++) {
NSString *entry = [NSString stringWithUTF8String:strs[i]];
[backtraceArray addObject:entry];
}
free(strs);
您必须确保不会对您的应用造成任何伤害:http://landonf.bikemonkey.org/2011/09/14。您还可以使用PLCrashReporter来处理所有崩溃,或者如果您像我一样懒惰,请使用Crittercism等服务
答案 2 :(得分:2)
我曾经使用backtrace_symbols来处理我的崩溃,但后来我发现它可能很危险,因为该方法不是异步安全的。我已经查看过一堆崩溃报告解决方案,并为我的应用程序使用Crittercism,它非常可爱!
答案 3 :(得分:1)
我建议您查看几天前发布的TestFlight SDK。它有一些很棒的功能,如远程日志记录甚至是实时崩溃报告。
答案 4 :(得分:0)
对于ad hoc版本,你可以调用函数abort(),或抛出某种异常。
如果App Store版本在测试期间完全崩溃,则不允许发布。