2011-02-09 59 views
1

我在AppStore中有一個iPhone應用程序,它很少報告特定類型的崩潰日誌,我無法重現,甚至找不到找到問題的起點。iPhone上的崩潰在kevent上

這是相關的系統崩潰日誌的部分:

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 

有誰知道這裏可能是什麼問題?我正在尋找任何允許我開始在代碼中查找問題的提示。

回答

2

SIGSEGV(Segmentation Violation的縮寫)意味着您的應用程序試圖解除引用(訪問)尚未分配或因其他原因無法取消引用的內存。

事實上,你不能複製崩潰使得它很難解決。

崩潰日誌中的所有「_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; 

解決我的問題。