【问题标题】:Will @try @catch work for SIGSEGV / SEGV_ACCERR@try @catch 是否适用于 SIGSEGV / SEGV_ACCERR
【发布时间】:2013-01-25 08:31:33
【问题描述】:

我在third party component 中遇到了崩溃。很明显,这是我必须研究的根本原因。但同时为了让这个更强大,我想用@try @catchblock 包围崩溃的调用。

到目前为止,我无法重现崩溃,所以我无法确定@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)

更新Apparently SIGSEGV 不是您可以捕获的异常,而是由访问无效内存引起的。从我的角度来看,能够捕获这种异常仍然很方便,尽管找到问题的根源显然是解决问题的更好方法。

【问题讨论】:

  • 我建议,要么修复MBProgressHUD 中的错误,要么移至更稳定且仍在由开发人员更新的SVProgressHUD

标签: iphone objective-c ios segmentation-fault


【解决方案1】:

不幸的是,当代码抛出异常时,try-catch 框架会很好,但对“信号”没有帮助。 (“SIGSEGV”中的“SIG”表示它是一个信号。)

为了处理信号,您必须为您的应用程序指定一个信号处理程序,该处理程序将在触发信号时由系统调用。

在堆栈以 objc_msgSend 结尾的任何类型的 SIGSEGV 的情况下,您很可能有代码试图调用已释放对象的方法。

您可以在启用“NSZombies”的设备上运行以提供帮助。当您尝试向它们发送消息时,这将保留少量对象以引发异常。

栈在objc_msgSend结束时可能会被奇怪地修改,所以实际的问题点可能与你在崩溃日志栈中看到的不同。

【讨论】:

    【解决方案2】:

    你调查过 NSSetUncaughtExceptionHandler 吗? 也可以使用信号函数将信号如 SIGSEGV 映射到处理函数

    【讨论】:

      猜你喜欢
      • 2012-05-14
      • 1970-01-01
      • 2017-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多