2

サードパーティのコンポーネントでクラッシュが発生しました。これには、私が調査しなければならない根本的な原因があることは明らかです。@try @catchしかし、それまでの間、これをより堅牢にするために、クラッシュする呼び出しをブロックで囲みたいと思います。

これまでのところクラッシュを再現できなかったので@try @catch、この場合にうまくいくかどうかはわかりません。どのような種類のケースが機能し@try@catch一般的に機能するかについての私の質問。

Hardware Model:      iPhone3,1
Process:         MyApp [2084]
Path:            /var/mobile/Applications/8B400A7D-88E7-4319-9C5D-F7E72DE8D960/MyApp.app/MyApp
Identifier:      com.company.MyApp-Snapshot
Version:         7.2
Code Type:       ARM
Parent Process:  launchd [1]

Date/Time:       2012-09-07 14:04:14 +0000
OS Version:      iPhone OS 5.1.1 (9B206)
Report Version:  104

Exception Type:  SIGSEGV
Exception Codes: SEGV_ACCERR at 0xe1088602
Crashed Thread:  0

Thread 0 Crashed:
0   libobjc.A.dylib    0x35260f78 objc_msgSend + 15
1   UIKit              0x312363d7 -[UIView(Hierarchy) superview] + 50
***************************************************************************                     |<---- UIView *superview = self.superview;
2   MyApp              0x000238f9 -[MBProgressHUD deviceOrientationDidChange:] (MBProgressHUD.m:622)
***************************************************************************
3   Foundation         0x37dc64ff __57-[NSNotificationCenter addObserver:selector:name:object:]_block_invoke_0 + 18
4   CoreFoundation     0x3752d547 ___CFXNotificationPost_block_invoke_0 + 70
5   CoreFoundation     0x374b9097 _CFXNotificationPost + 1406
6   Foundation         0x37d3a3eb -[NSNotificationCenter postNotificationName:object:userInfo:] + 66
7   UIKit              0x3123adeb -[UIDevice setOrientation:animated:] + 214
8   UIKit              0x3123616f -[UIApplication handleEvent:withNewEvent:] + 2718
9   UIKit              0x31235567 -[UIApplication sendEvent:] + 54
10  UIKit              0x31234f3b _UIApplicationHandleEvent + 5826
11  GraphicsServices   0x33c7722b PurpleEventCallback + 882
12  CoreFoundation     0x37535523 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 38
13  CoreFoundation     0x375354c5 __CFRunLoopDoSource1 + 140
14  CoreFoundation     0x37534313 __CFRunLoopRun + 1370
15  CoreFoundation     0x374b74a5 CFRunLoopRunSpecific + 300
16  CoreFoundation     0x374b736d CFRunLoopRunInMode + 104
17  GraphicsServices   0x33c76439 GSEventRunModal + 136
18  UIKit              0x31263cd5 UIApplicationMain + 1080
19  MyApp              0x00003643 main (main.m:16)

更新どうやら SIGSEGVあなたが捕まえることができる例外ではありませんが、無効なメモリにアクセスすることによって引き起こされます。問題の根本を突き止めることが問題を解決するためのより良いアプローチであったことは明らかですが、私の観点からは、この種の例外をキャッチできると便利です。

4

2 に答える 2

7

残念ながら、コードが例外をスローする場合、try-catchフレームは適切ですが、「シグナル」には役立ちません。(「SIGSEGV」の「SIG」は、シグナルであったことを意味します。)

シグナルを処理するには、シグナルが発生したときにシステムによって呼び出されるアプリケーションのシグナルハンドラーを指定する必要があります。

スタックがobjc_msgSendで終わる任意のタイプのSIGSEGVの場合、リリースされたオブジェクトのメソッドを呼び出そうとするコードがある可能性が非常に高くなります。

デバイスでは、「NSZombies」を有効にして実行できます。これにより、オブジェクトにメッセージを送信しようとしたときに例外をスローするために、オブジェクトの小さなビットが保持されます。

スタックはobjc_msgSendで終わるときに奇妙に変更される可能性があるため、実際の問題点はクラッシュログスタックに表示されるものとは異なる場合があります。

于 2013-01-25T00:31:33.263 に答える
0

NSSetUncaughtExceptionHandlerを調査しましたか?シグナル関数を使用して、SIGSEGVなどのシグナルをハンドラー関数にマップすることもできます。

于 2012-09-12T08:51:18.480 に答える