কোনও আইওএস অ্যাপ ক্রাশ করার একটি নির্ভরযোগ্য উপায় কী?


136

আমি যখন ব্যবহারকারী কোনও নির্দিষ্ট ক্রিয়া সম্পাদন করেন যা সত্যিকারের ব্যবহারকারীর দুর্ঘটনাক্রমে সম্ভব না হয় তখন আমি ইচ্ছাকৃতভাবে ক্র্যাশ করে আমার অ্যাপ্লিকেশনটির ক্র্যাশ প্রতিবেদনটি মাঠে পরীক্ষা করতে চাই test

কিন্তু অ্যাপ্লিকেশন ক্রাশ করার একটি ভাল নির্ভরযোগ্য উপায় কী যা সংকলনের সময়ে কোনও সতর্কতা তৈরি করে না?

সম্পাদনা: নোট করুন যে এই প্রশ্নের বেশিরভাগ আপাতদৃষ্টিতে সুস্পষ্ট উত্তরগুলি ব্যতিক্রমগুলির ফলাফল হিসাবে দেখা যায় যা কোকোয় ধরা পড়ে এবং ফলে অ্যাপটি ক্র্যাশ হয় না।


আমি WebKit discarded an uncaught exceptionএখন পর্যন্ত এই সব ধারণার জন্য পেয়েছি ! কে জানত যে এই দিনগুলিতে একটি অ্যাপ ক্রাশ করা এত কঠিন ছিল?
নেস্টর

আমি মনে করি না ওয়েবকিটের সাথে এর কারও কিছু করার আছে ...
বোল্টক্লক

23
হ্যাঁ, আইপ্যাড 1 এ সাফারিটি খুলুন এবং প্রচুর চিত্র সহ একটি পৃষ্ঠাতে ব্রাউজ করুন। সর্বদা আমার জন্য কাজ করে। : /
অ্যালান বি

4
(void)0/0;,(void)*(char*)0;
কেভিন

1
অপরিবর্তিত আচরণের জন্য এখানে কিছু উত্তর দিয়ে সতর্ক থাকুন । এটি আসলে খুব বাজে পরামর্শ!
usr ডিরেক্টরির

উত্তর:


140

উদ্দেশ্য-সিতে খারাপ ব্যবহারের জন্য সরাসরি সি ব্যবহার করুন

strcpy(0, "bla");

দ্রষ্টব্য: আমি জানি এমন যে কোনও সিস্টেমে এটি কাজ করে - সি রানটাইমের ভবিষ্যতের সংস্করণে বা সংকলকটির ফলে এটি আর ক্রাশ নাও হতে পারে। দেখতে উদ্দেশ্য সি মধ্যে অনির্ধারিত আচরণ ডি-রেফারেন্স হল নাল পয়েন্টার? )

(এই কাজটি করার জন্য আপনাকে দ্রুত পদক্ষেপ নিতে হবে)



হ্যাঁ হ্যাঁ, WebKit discarded an uncaught exceptionসমস্যাটিও প্রায় ঘটে।
নেস্টর

এখনও একটি টাইপো ছিল: ডি

4
স্পষ্টতই ( স্ট্যাকওভারফ্লো.com / প্রশ্নস / ১৩6565১642২/২ ), এটি অনির্ধারিত আচরণ এবং আসলে খুব খারাপ উত্তর! সংকলক আইনত উভয় বিবৃতি অপ্টিমাইজ করতে পারে এবং কিছুই করতে পারে না। আমি আপনাকে এই উত্তরটি মুছে ফেলার পরামর্শ দিচ্ছি। এটি মানুষকে আসলে এটি করতে পরিচালিত করতে পারে।
usr ডিরেক্টরির

3
আইওএস এবং ওএসএক্স এবং উইন্ডোজ এবং রেডহ্যাটে এটি সর্বদা প্রদত্ত প্রেক্ষাপটে ক্র্যাশ হয়ে গেছে, আমি এর বৈধতা বলতে চাই। আমি একটি দাবি অস্বীকার করব
ডাইজ-ডিজন

97

আমার বর্তমান প্রিয়:

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

একটি ক্লাসিক:

kill( getpid(), SIGABRT );

এবং কিছু pr0n:

*(long*)0 = 0xB16B00B5;

এগুলির সমস্তই আমার ক্র্যাশ প্রতিবেদনের সরঞ্জাম দ্বারা ক্যাপ্রেস তৈরি করেছে।


14
দাবী প্রকাশের সংস্করণগুলিতে ক্রাশ হয় না, এজন্যই এটি একটি দাবী
ডার্থমাইক

6
এটি আপনার বিল্ড সেটিংসের উপর নির্ভর করে; এছাড়াও, আমি মনে করি প্রশ্নটি পরীক্ষার বিষয়ে, এটি পরীক্ষা
নিরীক্ষায় জোর দেওয়া

3
রিলিজ বিল্ডগুলিতে প্রচুর লোক (আমাকে সহ) জোর ছেড়ে চলেছে। এগুলি অক্ষম করার কোনও কারণ নেই।
সুলতান

5
@ সুলতান: assert()এটি একটি ডিবাগ বৈশিষ্ট্য, মুক্তির জন্য এই ধরনের ক্রাফ্ট ছেড়ে যাওয়ার কোনও মানে নেই। তার জন্য ইউনিট পরীক্ষা রয়েছে।
MestreLion

18
আইএমএইচও assertকোনও ডিবাগ বৈশিষ্ট্য নয়। একটি ব্যর্থ দাবী একটি বাগ যা আপনি অসম্ভব বলে মনে করেছিলেন। অপ্রত্যাশিত পরিণতি সহ একটি প্রোগ্রাম চালিয়ে যাওয়ার চেয়ে এটি বাতিল করা, এমনকি একটি রিলিজ বিল্ড করা ভাল।
djromero

27

যেহেতু আমরা সবাই আইওএসের জন্য কলঙ্ক ব্যবহার করি, এটি মোটামুটি নির্ভরযোগ্য:

__builtin_trap();

এটি হ'ল এই সুবিধাটি এটি ঠিক এই উদ্দেশ্যে তৈরি করা হয়েছে, সুতরাং এটি কোনও সংকলক সতর্কতা বা ত্রুটি তৈরি করা উচিত নয়।



22

কিভাবে একটি ভাল পুরানো স্ট্যাক ওভারফ্লো সম্পর্কে :)

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

16

সর্বাধিক জনপ্রিয় এক - অপরিচিত সনাক্তকারী নির্বাচক ক্রাশ:

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

নিশ্চিত করুন যে আপনার কাছে -sdf পদ্ধতিটি সেই শ্রেণিতে প্রয়োগ করা হয়নি haha

বা সীমাবদ্ধ ব্যতিক্রমের বাইরে সূচি:

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
এটি আসলে খুব বিশ্বাসযোগ্য নয় is যতক্ষণ না তাদের স্মৃতি পুনরায় ব্যবহার না করা হয় আপনি ততক্ষণ অবনমিত অবজেক্টগুলিতে বার্তা পাঠাতে পারেন। এই পুরো কারণেই লোকেরা doubleতিহাসিকভাবে ডাবল-রিলিজ ত্রুটিগুলি ডিবাগ করতে খুব কষ্ট পেয়েছিল। এটি কেবল তখনই যখন মেমোরিটি অন্য কোনও অবজেক্টের কাছে পুনরুদ্ধার করে যে কোনও বার্তা প্রেরণের ব্যতিক্রম ঘটতে পারে।
মাইক ওয়েলার

7
exit(0);

(অবশ্যই ... টাইপ ... 30 অক্ষর)


উর্ধ্বেদের জন্য ধন্যবাদ তবে প্রকৃতপক্ষে এটি অ্যাপ্লিকেশনটি বন্ধ করে স্প্রিংবোর্ডে ফিরিয়ে আনবে, এটি যদিও এটি নিজের মধ্যে কার্যকর হতে পারে তবে ওপি যা চায়নি তা নয়, যা একটি অপ্রকাশিত ব্যতিক্রম ট্রিগার করতে পারে
স্টিভ রজার্স

6

আপনি একটি ব্যতিক্রম বাড়াতে পারেন:

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

2
আমার মনে হয় না যে ব্যতিক্রমটি ভাল উপায়, ব্যতিক্রম ধরা সাধারণ কারণ যাতে আপনি দুর্ঘটনাক্রমে এটি ধরতে পারেন। সিগন্যালগুলি ধরা এত সাধারণ নয় তাই খারাপ অ্যাক্সেস বা অনুরূপ জিনিসগুলি আরও নির্ভরযোগ্য হবে। :)
Michał Kreft

3

10 টি আঙুলের ট্যাপ (আইফোনটির জন্য 5 টি আঙুল 10 হিসাবে কিছুটা ভিড় পেতে পারে) সনাক্ত করে এমন দৃশ্যে একটি অঙ্গভঙ্গি শনাক্তকারী যুক্ত করুন। জিআর এর সাথে একটি পদ্ধতি সংযুক্ত রয়েছে যা আপনার অ্যাপ্লিকেশনটি ক্রাশ হওয়ার জন্য পূর্বে উল্লিখিত নিশ্চিতফায়ার উপায়গুলির মধ্যে যে কোনওটিকে কার্যকর করে। বেশিরভাগ ব্যবহারকারী আপনার অ্যাপে 10 টি আঙুল দিয়ে যাবেন না, তাই আপনি দুর্ঘটনাক্রমে ক্রাশ ঘটাচ্ছেন এমন সাধারণ ব্যবহারকারী থেকে নিরাপদ।

তবে আপনার টেস্টফ্লাইটের মতো কিছু ব্যবহার করতে বা এটি কেবল ব্যক্তিগত অ্যাপ্লিকেশনগুলিতে স্থাপন করা এবং এটি অ্যাপলের কাছে জমা দেওয়ার আগে বন্যে পরীক্ষা করা উচিত। জোর করে ক্র্যাশ হওয়া আপনার অ্যাপ্লিকেশনটিকে প্রত্যাখ্যান করতে পারে।


যখন আমি চরম মাল্টি টাচ করি তখন আমার কোকোস 2 ডি অ্যাপ্লিকেশানটি ক্র্যাশ হয়ে যায় এবং আমি এটি অমীমাংসিত বাগ হিসাবে পেয়েছি। আমার কোনও জিআর নেই, তবে আমি কোকোস 2 ডি তে মাল্টিটচ সক্ষম করেছি। আপনি বর্ণিত ক্র্যাশটি কি আমি অনুভব করি? আপনি বোঝাতে চাইছেন যে এটি প্রত্যাশিত / চাওয়া আচরণ?
ফ্রেড্রিক জোহানসন

@ ফ্রেড্রিক আমার মনে হয় না যে আপনি যে ক্র্যাশ বর্ণনা করছেন তা প্রত্যাশিত (আইএমও ক্র্যাশ কখনই প্রত্যাশা করা উচিত নয় এবং আমি ব্যক্তিগতভাবে মনে করি না যে এই বিষয়টির জন্য উদ্দেশ্যমূলকভাবে আপনার অ্যাপে রাখা ভাল ধারণা)। আপনি ক্র্যাশটিকে প্রতীকী করে দেখার চেষ্টা করতে পারেন এবং ঠিক কী কী পদ্ধতিটি অ্যাপটি ক্র্যাশ করছে তা আবিষ্কার করার চেষ্টা করতে পারেন। কোকোস 2 ডি ফ্রেমওয়ার্কের অভ্যন্তরে এমন কিছু হতে পারে যা 'চরম মাল্টি টাচ' দেখা দিলে ক্র্যাশ ঘটায়। যদি এটি হয় তবে আপনার সেরা বেটটি কোকোস 2 ডি ছেলেদের সাথে একটি বাগ ফাইল করা।
ঝিলজার

2

কিছু চেষ্টা করতে পারে

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

একটি EXC_BAD_ACCESS এ ক্র্যাশ হওয়া উচিত (এটি দ্বিতীয়বার প্রকাশের প্রয়োজন হতে পারে তবে সাধারণভাবে এটি ইতিমধ্যে এর মতো ক্র্যাশ হওয়া উচিত)


3
এআরসি সক্ষম দ্বারা সংকলিত হবে না।
ভাইকিংগুন্ডো

আচ্ছা আপনি যদি এআরসি ব্যবহার করেন তবে আপনি এটিও করতে পারেন: এনএসআরএ * ক্র্যাশিংআরে = [এনএসআর অ্যারেউইথক্যাপ্যাসিটি: 1]; [ক্র্যাশিংআরাই অবজেক্টএটিআইডেক্স: 0]; এটি ক্র্যাশ হওয়া উচিত
সালিওম

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'


-1

একটি ভুল NSLogবিবৃতি এটি করবে

NSLog(@"%@",1);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.