2012-03-22 10 views
2

は、私が(切り捨て)以下のクラッシュレポートを受け取っ@ try/@ catchブロックでどのようにクラッシュしましたか?

Exception Type: EXC_CRASH (SIGSEGV) 
Exception Codes: 0x00000000, 0x00000000 
Crashed Thread: 0 

Thread 0 name: Dispatch queue: com.apple.main-thread 
Thread 0 Crashed: 
0 libsystem_kernel.dylib   0x36df00d8 __psynch_mutexwait + 24 
1 libsystem_c.dylib    0x31760674 pthread_mutex_lock + 376 
2 CoreFoundation     0x31f2338a CFRunLoopWakeUp + 50 
3 WebCore       0x308d0bc8 _WebThreadRun + 284 
4 UIKit       0x37921c7a -[UIWebDocumentView _runLoadBlock:] + 38 
5 UIKit       0x37921c3a -[UIWebDocumentView _cleanUpFrameStateAndLoad:] + 114 
6 UIKit       0x37921bbe -[UIWebDocumentView loadHTMLString:baseURL:] + 78 

の懸念は、呼び出し元のコードはこのようになっていることである。

@try { 
    [webView loadHTMLString:htmlString baseURL:nil]; 
    [webView setNeedsDisplay];  
} 
@catch (NSException *exception) {...} 

だから、どのように私は例外の中から例外をスローするように管理しましたハンドラ?

私はキャッチの中から投げる方法を呼び出さなかった。私がそこでやっているのは、NSLogに例外、webView、およびhtmlStringをダンプすることだけです。彼らが例外を引き起こしていたなら、私はクラッシュスタックが異なって見えると思うでしょう。

これは潜在的なOSのバグを減らしているようですか?

答えて

7

セグメンテーションフォールト(SIGSEGV)これは例外ではありません。

これらのフォルトは例外ではありません。つまり、try/catchブロックを使用できません。

セグメント違反とは、アプリに属していないメモリ領域にアクセスしようとしていることを意味します。

場合によっては、解放されたオブジェクトが自動的に解放され、アクセスされる可能性があります(オブジェクトの割り当てが解除されたため、ポインターは無効です)。

あなたhtmlString変数がまだ有効なオブジェクトを指していることを確認し...ところで

、私はsetNeedsDisplayを呼び出すとは思わないがloadHTMLStringを使用した後に必要とされています。

+0

これは意味があります。呼び出しは、死にかけているスレッドから呼び出される関数内にあります。私はメソッドがメインスレッド上で自分自身を呼び出すことを確認するためにメソッドを保護しました。これは、スレッドに送信された文字列が、スレッド終了した呼び出し元のまま終了し、自身をクリーンアップすることを保証するものではありません。特にこれに感謝します。 segfaultは例外処理で捕まえることができると思いました。私はその知識に感謝します。 –

+0

セグメンテーションフォールトは信号で、OSによってアプリケーションに送信されます。これらは、シグナルハンドラによって「捕まえられる」ことができます(signal()関数を参照)。セグメンテーションフォールトはシグナルハンドラで管理することができますが、デバッグを除いて、アプリケーションが矛盾した状態になるので、通常はそれを実行することをお勧めしません。 – Macmade

関連する問題