我在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
有谁知道这里可能出现什么问题?我正在寻找任何允许我开始在代码中寻找问题的提示。
答案 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;
解决了我的问题。