2009-07-14 6 views
9

私はhttp://code.google.com/p/google-toolbox-for-macからGTMStackTraceを使用しています。NSSetUncaughtExceptionHandlerがiPhoneのすべてのエラーをキャッチしない

アプリがクラッシュしたときにエンドユーザがエラーを送信する方法をテストする必要があります。私はどのように私のウェブサイトにデータを送るのか知っていますが、問題はどのように処理されていないエラーをすべて捕まえるかということです

私はこのコードを持っている:

void exceptionHandler(NSException *exception) { 
    NSLog(@"%@", [exception reason]); 
    NSLog(@"%@", [exception userInfo]); 
    NSLog(@"%@", GTMStackTraceFromException(exception)); 

    UIAlertView *alert = [[UIAlertView alloc] 
          initWithTitle:NSLocalizedString(@"Error unexpected",@"Info: Can't save record") 
          message:GTMStackTraceFromException(exception) delegate:nil 
          cancelButtonTitle:NSLocalizedString(@"Ok",@"Button: Ok") otherButtonTitles:nil]; 
    [alert show]; 
    [alert release];  
} 

int main(int argc, char *argv[]) { 
    //For crash report.. 
    NSSetUncaughtExceptionHandler(&exceptionHandler); 
    //Normal code... 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 
    int retVal = UIApplicationMain(argc, argv, nil, nil); 
    [pool release]; 
    return retVal; 
} 

はしかし、事は悪いのリリース、BAD ACCES、などのように、エラーの多くをキャッチされない、とアプリケーションが消えます。私は2つの問題があります。どこに問題があるのか​​明確ではなく、エンドユーザは何を言いたいのか分からないのです。

だから、私が得るどのようにエンドユーザーのシンプルなので、すべてのその厄介なエラーが私にクラッシュレポートを送信する(例えば、リリースのために二度同じvarがキャッチされていませんか)?

+0

また、エラーラインでフルスタックトレースを取得することはできますか? – mamcx

+0

あなたは実際にそのUIAlertViewを表示させることができますか?私はできない。何かアドバイス? – Mark

答えて

19

EXC_BAD_ACCESSは例外を生成しないため、シグナル(SIGSEGV)を生成します。それを捕まえるには、シグナルハンドラが必要です。 Christopher Atlanは、両方の種類のクラッシュを処理する方法のnice explanationを書きました。 part 1part 2の両方を必ず読んでください。

1

誰もが、まだこの問題を扱っているとさえSIGSEGVが私のポストを参照して、それをうまくできない場合は... EXC_BAD_ACCESS automatic handling

関連する問題