在iPhone上崩溃

时间:2011-02-09 09:05:04

标签: iphone objective-c

我在AppStore中有一个iPhone应用程序很少报告我无法重现的特定类型的崩溃日志,甚至找不到寻找问题的起点。

这是相关的崩溃日志的一部分:

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

Thread 1 Crashed:
0   libSystem.B.dylib               0x31192974 kevent + 24
1   libSystem.B.dylib               0x3123c704 _dispatch_mgr_invoke + 88
2   libSystem.B.dylib               0x3123c174 _dispatch_queue_invoke + 96
3   libSystem.B.dylib               0x3123bb98 _dispatch_worker_thread2 + 120
4   libSystem.B.dylib               0x311e024a _pthread_wqthread + 258
5   libSystem.B.dylib               0x311d8970 start_wqthread + 0

有谁知道这里可能出现什么问题?我正在寻找任何允许我开始在代码中寻找问题的提示。

1 个答案:

答案 0 :(得分:2)

SIGSEGV(分段违例的缩写)表示您的应用程序尝试取消引用(访问)尚未分配或因其他原因无法解除引用的内存。

您无法复制崩溃的事实使得解决起来更加困难。

崩溃日志中的所有“_dispatch”调用似乎表明线程1正在使用GCD(或者可能是在幕后使用GCD的其他一些API)来访问在块外部更改的某个变量(来自另一个线程) )。

也可能是您正在尝试访问未初始化的变量(这是SIGSEGV通常的意思)。

我的建议是查看任何GCD代码和其他多线程代码,重点关注线程安全和可变对象(例如NSMutableArrays)。

此外,查看您的内存管理并确保所有变量都已初始化并正确保留/释放。我遇到了像你这样的日志崩溃,问题是声明变量而没有立即初始化

MyClass *myVariable;
...
// Do some calculations that may or may not initialize the variale
...
if (myVariable) {
    [myVariable doSomething];  // <-- crash
}

将声明更改为:

MyClass *myVariable = nil;

解决了我的问题。