2012-04-25 20 views
13

मैं आईओएस के लिए अपना खुद का सिग्नल और अपरिचित अपवाद हैंडलर बनाने की कोशिश कर रहा हूं। ऐसा करने के लिए मैं इन दोनों कार्यों का उपयोग करें:EXC_BAD_ACCESS स्वचालित हैंडलिंग

NSSetUncaughtExceptionHandler(/*handler*/); 

और

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

मेरे समस्या यह है कि मैं इसे EXC_BAD_ACCESS संकेत के साथ काम नहीं कर सकता। क्या EXC_BAD_ACCESS को पकड़ने के लिए कुछ सिग्नल स्थिर (जैसे सिगैबर्ट, सिगबस) है? यदि नहीं, मैं इसे कैसे संभाल सकता हूं? कुछ क्रैश एनालिटिक्स टूल (lika PLCrashReporter, Crashlytics आदि) इसका पता लगा सकते हैं ...

+1

यह पोस्ट देखें: http://stackoverflow.com/questions/1128539/nssetuncaughtexceptionhandler-not-catch- सभी त्रुटियों पर-ऑन-आईफोन – Lefteris

+0

अच्छी तरह से, पहले से ही SIGSEGV शामिल है लेकिन यह अभी भी EXC_BAD एक्सेस नहीं पकड़ता है:/hmmmm ... लेकिन टिप्पणी के लिए धन्यवाद! :) –

उत्तर

8

EXC_BAD_ACCESS अपवाद उत्पन्न नहीं करता है ताकि आप पहले कार्य इस मामले के साथ काम न करें। यह संकेत SIGSEGV या SIGBUS उत्पन्न करता है।

कृपया कोको के साथ Handling unhandled exceptions and signals देखें।

अद्यतन

मैं सिर्फ 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

:) उत्तर देने के लिए धन्यवाद! मैं इस ट्यूटोरियल से अपना "मॉड्यूल" लिख रहा हूं और जैसा कि मैंने पहले ही अपने प्रश्न पर टिप्पणी की है, मैं पहले से ही सिगसेव और सिगबस को संभालने वाला हूं लेकिन बिना किसी किस्मत के। मैं अभी भी EXC_BAD_ACCESS को संभाल नहीं सकता ... प्यार के साथ कोको पर उस ट्यूटोरियल के भीतर टिप्पणियां पढ़ने का प्रयास करें ... कुछ लोगों को मेरे जैसा ही समस्या है ... –

+0

एलएलडीबी के स्रोत कोड में देखा और मेरे जवाब में मेरे निष्कर्ष अपडेट किए ... – Hailei

+0

धन्यवाद! वास्तव में! :) यह स्पष्ट रूप से इस समस्या का समाधान हो सकता है ... लेकिन अब मैं उलझन में हूं, क्योंकि मैं इस तरह की नौसिखिया हूं, मैं इसे कैसे संभाल सकता हूं? :) कॉलिंग सिग्नल (0x91,/* हैंडलर) मदद नहीं की ... मुझे अब बेवकूफ दिखना चाहिए :) –