IOS ऐप क्रैश करने का एक विश्वसनीय तरीका क्या है?


136

मैं अपने ऐप की क्रैश रिपोर्टिंग को फील्ड में रिपोर्ट करके जानबूझकर इसे क्रैश करना चाहता हूं जब उपयोगकर्ता एक विशेष कार्रवाई करता है जो वास्तविक उपयोगकर्ता द्वारा गलती से करने की संभावना नहीं है।

लेकिन ऐप क्रैश करने का एक अच्छा विश्वसनीय तरीका क्या है जो संकलन समय पर चेतावनी नहीं बनाता है?

संपादित करें: ध्यान दें कि इस प्रश्न के कई स्पष्ट जवाब अपवाद हैं जो कोको द्वारा पकड़े गए हैं और इस प्रकार ऐप के दुर्घटनाग्रस्त होने का परिणाम नहीं है।


मैं WebKit discarded an uncaught exceptionइन सभी विचारों के लिए अब तक हो रहा हूँ ! कौन जानता था कि इन दिनों ऐप क्रैश करना इतना मुश्किल था?
नेस्टर

मुझे नहीं लगता कि इनमें से किसी भी वेबकिट से कोई लेना देना नहीं है ...
BoltClock

23
हां, iPad 1 पर Safari खोलें और बहुत सारी छवियों वाले पृष्ठ पर ब्राउज़ करें। हमेशा मेरे लिए काम करता है। : /
एलन बी

4
(void)0/0;,(void)*(char*)0;
केविन

1
यहां कुछ उत्तरों से सावधान रहें जो अपरिभाषित व्यवहार को आमंत्रित करते हैं । यह वास्तव में बहुत बुरा सलाह है!
यूएसआर

जवाबों:


140

उद्देश्य-सी में सी का उपयोग सीधे खराब पहुंच का कारण बनता है

strcpy(0, "bla");

नोट: जबकि यह मेरे द्वारा ज्ञात किसी भी सिस्टम पर काम करता है - सी रनटाइम या कंपाइलर के भविष्य के संस्करण में यह अब दुर्घटना का कारण नहीं बन सकता है। देखें क्या अशक्त सूचक उद्देश्य-सी में अपरिभाषित व्यवहार है? )

(स्विफ्ट में आपको ऐसा करने के लिए objC को पुल करना होगा)


यह IMHO सबसे विश्वसनीय तरीका है
मिशैल क्रेफ्ट

आह हाँ, यह WebKit discarded an uncaught exceptionभी समस्या के आसपास हो जाता है।
नेस्टर

अभी भी एक टाइपो था: D no @ "bla", लेकिन "bla"
Daij-Djan

4
जाहिर है ( stackoverflow.com/questions/13651642/… ), यह अपरिभाषित व्यवहार है और वास्तव में एक बहुत बुरा जवाब है! संकलक कानूनी रूप से दोनों कथनों का अनुकूलन कर सकता है और बस कुछ नहीं कर सकता है। मेरा सुझाव है कि आप इस उत्तर को हटा दें। यह लोगों को वास्तव में ऐसा करने के लिए प्रेरित कर सकता है।
यूएसआर

3
ios और osx और विंडोज़ और रेडहैट पर यह हमेशा दिए गए संदर्भ में दुर्घटनाग्रस्त हो जाता है, मैं कहूंगा कि यह वैध है। मैं एक अस्वीकरण
जोड़ूंगा

97

मेरा वर्तमान पसंदीदा:

assert(! "crashing on purpose to test <insert your reason here>");

एक पारम्परिक:

kill( getpid(), SIGABRT );

और कुछ pr0n:

*(long*)0 = 0xB16B00B5;

वे सभी मेरे क्रैश रिपोर्टिंग टूल द्वारा कैप्चर किए गए क्रैश उत्पन्न करते हैं।



6
यह आपकी बिल्ड सेटिंग्स पर निर्भर करता है; मुझे यह भी लगता है कि सवाल परीक्षण के बारे में है, परीक्षण बिल्ड में जोर देना ठीक लगता है
djromero

3
बहुत से लोग (मेरे सहित) रिलीज़ बिल्ड में जोर देते हैं। उन्हें निष्क्रिय करने का कोई कारण नहीं है।
सुल्तान

5
@ सुल्तान: assert()एक डिबग फीचर है, रिलीज बिल्ड में इस तरह के क्रॉफ्ट को छोड़ने का कोई मतलब नहीं है। उसके लिए इकाई परीक्षण हैं।
मेस्ट्रेलियन

18
IMHO assertएक डीबग सुविधा नहीं है। एक असफल मुखर एक बग है जिसे आपने असंभव माना। यह अप्रत्याशित है, यहां तक ​​कि एक रिलीज़ बिल्ड भी, अप्रत्याशित परिणामों के साथ एक कार्यक्रम चलाना जारी रखें।
djromero

27

चूंकि हम सभी iOS के लिए Clang का उपयोग करते हैं, यह काफी विश्वसनीय है:

__builtin_trap();

इसका यह लाभ है कि इसे इस उद्देश्य के लिए डिज़ाइन किया गया है, इसलिए इसे किसी भी संकलक की चेतावनी या त्रुटियों को उत्पन्न नहीं करना चाहिए।



22

कैसे एक अच्छा पुराने ढेर अतिप्रवाह के बारे में :)

- (void)stackOverflow
{
    [self stackOverflow];
}

16

सबसे लोकप्रिय एक - अज्ञात चयनकर्ता दुर्घटना:

NSObject *object = [[NSObject alloc] init];
[object performSelector:@selector(asfd)];

सुनिश्चित करें कि आपके पास -asdf विधि उस वर्ग हा में लागू नहीं है

या बाध्य अपवाद से परे सूचकांक:

NSArray * array = [NSArray array];
[array objectAtIndex:5];

और निश्चित रूप से kill( getpid(), SIGABRT );


12

मुझे लगता है कि स्विफ्ट में आप आसानी से एक घातक त्रुटि फेंक सकते हैं:

func foo() {
    fatalError("crash!")
}

यह वास्तव में भी इस सुविधा का उपयोग करने का इरादा है कि ऐप को क्रैश करने के लिए कुछ गलत हो जाए।

एक विशेष मामले में एक बयान से बचने के लिए, आप भी उपयोग कर सकते हैं precondition। यह समान है assert, इस प्रकार इरादा (यदि चाहता है) बहुत स्पष्ट है और के रूप में अंतिम रिलीज में हटाया नहीं है assert। इसका उपयोग किया जाता है precondition(myBoolean, "This is a helpful error message for debugging.")


9

किसी डीलडॉक्लेटेड ऑब्जेक्ट को संदेश भेजें


34
यह वास्तव में बहुत अविश्वसनीय है। जब तक उनकी मेमोरी का पुन: उपयोग नहीं किया जाता है तब तक आप तब तक टैक्लोकेटेड ऑब्जेक्ट को संदेश भेज सकते हैं। यह पूरी वजह है कि लोगों को ऐतिहासिक रूप से दोहरे रिलीज की त्रुटियों को दूर करने के लिए बहुत मुश्किल था। यह केवल तब होता है जब मेमोरी को किसी अन्य ऑब्जेक्ट द्वारा पुनः प्राप्त किया जाता है जो संदेश भेजना अपवाद का कारण हो सकता है।
माइक वेलर

7
exit(0);

(अवश्य ... टाइप ... 30 अक्षर)


अपवोट के लिए धन्यवाद, लेकिन वास्तव में यह ऐप को समाप्त कर देगा और स्प्रिंगबोर्ड पर वापस आ जाएगा, जो, हालांकि यह अपने आप में उपयोगी हो सकता है, ओपी नहीं चाहता था, जो कि एक अपवाद को छोड़ना है
स्टीव रोजर्स

6

आप एक अपवाद भी बढ़ा सकते हैं:

[NSException raise:NSInternalInconsistencyException
            format:@"I want to test app crashes!."];

2
मुझे नहीं लगता कि अपवाद यह है कि अच्छा तरीका है, अपवाद को पकड़ना आम है ताकि आप गलती से इसे पकड़ सकें। कैचिंग सिग्नल इतना सामान्य नहीं है ताकि खराब पहुंच या इसी तरह की चीजें अधिक विश्वसनीय हों। :)
मिचेल क्रेफ्ट 10

3

एक इशारा पहचानकर्ता को एक ऐसे दृश्य में जोड़ें जो 10 उंगली टैप को पहचानता है (10 के रूप में iPhone के लिए 5 उंगलियां थोड़ी भीड़ मिल सकती हैं)। जीआर के पास एक ऐसा तरीका है जो आपके ऐप को क्रैश करने के लिए पहले से उल्लेखित अचूक तरीकों में से किसी को निष्पादित करता है। अधिकांश उपयोगकर्ता आपके एप्लिकेशन पर 10 अंगुलियां नीचे रखने वाले नहीं हैं, इसलिए आप सामान्य उपयोगकर्ता से गलती से दुर्घटनाग्रस्त होने से सुरक्षित हैं।

हालाँकि, आपको टेस्टफ़लाइट जैसी किसी चीज़ का उपयोग करने में सक्षम होना चाहिए या फिर इसे Apple में सबमिट करने से पहले इसे केवल व्यक्तिगत उपकरणों पर लागू करना और जंगली में परीक्षण करना चाहिए। जबर्दस्ती क्रैश होने से आपका ऐप्पल द्वारा अस्वीकार कर दिया गया।


जब मैं एक चरम मल्टी टच करता हूं, तो मेरा Cocos2d ऐप क्रैश हो जाता है और मुझे वह एक अनसुलझे बग के रूप में मिल गया है। मेरे पास कोई GR नहीं है, लेकिन मैंने Cocos2d में मल्टीटच सक्षम किया है। क्या मुझे आपके द्वारा वर्णित क्रैश का अनुभव है? आपका मतलब है कि यह अपेक्षित / व्यवहार है?
फ्रेड्रिक जोहानसन

@Fredrik मुझे नहीं लगता कि आप दुर्घटना कर रहे हैं आप उम्मीद कर रहे हैं (IMO क्रैश की कभी भी उम्मीद नहीं की जानी चाहिए और मुझे व्यक्तिगत रूप से ऐसा नहीं लगता कि यह उद्देश्यपूर्ण ढंग से उस मामले के लिए आपके ऐप में एक अच्छा विचार है)। आप क्रैश का प्रतीकात्मक रूप से पता लगा सकते हैं और यह पता लगा सकते हैं कि ऐप किस दुर्घटना का कारण बन रहा है। यह Cocos2d ढांचे के अंदर कुछ हो सकता है जो 'चरम मल्टी टच' होने पर दुर्घटना का कारण बन रहा है। अगर ऐसा है तो आपका सबसे अच्छा शर्त Cocos2d लोगों के साथ एक बग दाखिल कर रहा है।
jhelzer

2

कुछ इस तरह की कोशिश कर सकता है

NSArray* crashingArray = [NSArray arrayWithCapacity:1];
[crashingArray release];

EXC_BAD_ACCESS पर क्रैश होना चाहिए (इसे दूसरी बार जारी करने की आवश्यकता हो सकती है, लेकिन सामान्य रूप से इसे पहले ही क्रैश हो जाना चाहिए)


3
एआरसी सक्षम के साथ संकलन नहीं होगा।
vikingosegundo

अच्छी तरह से अगर आप एआरसी का उपयोग करते हैं तो आप यह भी कर सकते हैं: NSArray * crashingArray = [NSArray arrayWithCapacity: 1]; [क्रशिंगएयर्रे ऑब्जेक्टएटइंडेक्स: 0]; यह दुर्घटनाग्रस्त होना चाहिए
Saliom

1

मैं साथ जाऊंगा:int raise(int sig);

अधिक जानकारी प्राप्त करने के लिए >man raise


0

मैं इस प्रक्रिया को सामान्य रूप से मारूंगा:

kill(getpid(), SIGKILL);

इसलिए यदि आप सिग्नल के साथ एक हैंडलर स्थापित करते हैं, तो आप क्रैश को भी संभाल सकते हैं, खोली गई फ़ाइलों और इन चीजों को लिखने के लिए परिष्करण कर सकते हैं।



0

मैं उपयोग करता हूं

[self doesNotRecognizeSelector:_cmd]; 

2
इस पोस्ट को स्वचालित रूप से निम्न गुणवत्ता के रूप में चिह्नित किया जा रहा है क्योंकि यह केवल कोड है। क्या आप यह समझने के लिए कुछ पाठ जोड़कर इसका विस्तार करेंगे कि यह समस्या क्यों हल करती है?
गंग -

0

रूबीमोशन के साथ काम करते समय मैं इसका उपयोग करता हूं:

    n=Pointer.new ('c', 1)
    n[1000] ='h'


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.