2012-04-25 48 views
13

我想爲iOS構建自己的信號和未捕獲的異常處理程序。要做到這一點,我使用這兩個功能:EXC_BAD_ACCESS自動處理

NSSetUncaughtExceptionHandler(/*handler*/); 

signal(/*signal const*/, /*signal handler*/); 

我的問題是,我不能使它與EXC_BAD_ACCESS信號的工作。有沒有一些信號常量(如SIGABRT,SIGBUS)來捕捉EXC_BAD_ACCESS?如果不是,我該如何處理?一些崩潰分析工具(lika PLCrashReporter,Crashlytics等)可以跟蹤它...

+1

看到這個職位:http://stackoverflow.com/questions/1128539/nssetuncaughtexceptionhandler-not-catch-所有錯誤的iPhone – Lefteris 2012-04-25 12:33:24

+0

好吧,我已經包括SIGSEGV,但它仍然沒有捕獲EXC_BAD ACCESS:/ hmmmm ...但感謝評論! :) – 2012-04-25 12:37:07

回答

8

EXC_BAD_ACCESS不會生成異常,因此您的第一個功能不適用於此案例。它產生一個信號SIGSEGVSIGBUS

請參閱Handling unhandled exceptions and signals by Cocoa with Love。

更新

我只是檢查LLDB的源代碼。它可能是TARGET_EXC_BAD_ACCESS = 0x91。

在RNBRemote.h:

/* We translate the /usr/include/mach/exception_types.h exception types 
    (e.g. EXC_BAD_ACCESS) to the fake BSD signal numbers that gdb uses 
    in include/gdb/signals.h (e.g. TARGET_EXC_BAD_ACCESS). These hard 
    coded values for TARGET_EXC_BAD_ACCESS et al must match the gdb 
    values in its include/gdb/signals.h. */ 

#define TARGET_EXC_BAD_ACCESS  0x91 
#define TARGET_EXC_BAD_INSTRUCTION 0x92 
#define TARGET_EXC_ARITHMETIC  0x93 
#define TARGET_EXC_EMULATION  0x94 
#define TARGET_EXC_SOFTWARE  0x95 
#define TARGET_EXC_BREAKPOINT  0x96 

和RNBRemote.cpp:

// Translate any mach exceptions to gdb versions, unless they are 
// common exceptions like a breakpoint or a soft signal. 
switch (tid_stop_info.details.exception.type) 
{ 
    default:     signum = 0; break; 
    case EXC_BREAKPOINT:  signum = SIGTRAP; break; 
    case EXC_BAD_ACCESS:  signum = TARGET_EXC_BAD_ACCESS; break; 
    case EXC_BAD_INSTRUCTION: signum = TARGET_EXC_BAD_INSTRUCTION; break; 
    case EXC_ARITHMETIC:  signum = TARGET_EXC_ARITHMETIC; break; 
    case EXC_EMULATION:   signum = TARGET_EXC_EMULATION; break; 
    case EXC_SOFTWARE: 
     if (tid_stop_info.details.exception.data_count == 2 && 
      tid_stop_info.details.exception.data[0] == EXC_SOFT_SIGNAL) 
      signum = tid_stop_info.details.exception.data[1]; 
     else 
      signum = TARGET_EXC_SOFTWARE; 
     break; 
} 
+0

:)謝謝你的回覆!我正在寫本教程的「模塊」,因爲我早前已經評論過我的問題,我已經在處理SIGSEV和SIGBUS,但沒有運氣。我仍然無法處理EXC_BAD_ACCESS ...嘗試閱讀該教程中有關愛情可可的評論...幾乎沒有人和我有同樣的問題... – 2012-04-25 12:53:41

+0

查看LLDB的源代碼並在我的答案中更新了我的發現... – Hailei 2012-04-25 13:18:24

+0

感謝!真! :)這顯然可以解決這個問題...但我現在有點困惑,因爲我是一個新手這個,我該如何處理它? :)呼叫信號(0x91,/ *處理程序)沒有幫助...我現在必須看起來很愚蠢:) – 2012-04-25 13:28:06