【问题标题】:How did I crash in a @try/@catch block?我是如何在 @try/@catch 块中崩溃的?
【发布时间】:2012-03-22 15:50:08
【问题描述】:

我收到了以下崩溃报告(截断)

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) {...}

那么,我是如何设法从异常处理程序中抛出异常的?

我没有从 catch 内部调用 throwing 方法。我所做的只是将异常、webView 和 htmlString 转储到 NSLog。如果他们导致异常,我希望崩溃堆栈看起来不同。

这似乎减少了潜在的操作系统错误?

【问题讨论】:

    标签: ios exception exception-handling


    【解决方案1】:

    这是一个分段错误 (SIGSEGV),并非例外。

    这些错误不是异常,这意味着您不能使用 try/catch 块。

    分段错误意味着您正在尝试访问不属于您的应用的内存区域。

    在您的情况下,可能是自动释放的对象被释放,然后被访问(指针不再有效,因为对象已被释放)。

    确保您的 htmlString 变量仍指向有效对象...

    顺便说一句,我认为在使用loadHTMLString 之后不需要调用setNeedsDisplay

    【讨论】:

    • 好吧...这很有道理。该调用在一个函数中,该函数可以从一个垂死的线程中调用。我已经保护了该方法以确保它在主线程上调用自身。这并不能保证发送给它的字符串在线程调用者结束并自行清理后仍然存在。为此特别感谢。我认为可以通过异常处理来捕获段错误。我很感激这些知识。
    • 分段错误是信号,由操作系统发送给应用程序。它们可以被信号处理程序“捕获”(参见 signal() C 函数)。分段错误可以由信号处理程序管理,即使这样做通常不是一个好主意,但调试除外,因为它会使应用程序处于不一致的状态。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-25
    • 1970-01-01
    • 2017-05-17
    • 1970-01-01
    • 2011-04-17
    • 2011-01-15
    相关资源
    最近更新 更多