এক্সকোড ৪.২ ডিবাগ স্ট্যাক কলটির প্রতীক নয়


140

আইওএস 5 সিমুলেটর / ডিভাইসে এক্সকোড 4.2 ডিবাগিংয়ের সাথে আমার সমস্যা আছে। নিম্নলিখিত কোডটি ক্র্যাশ করেছে, যেমনটি প্রত্যাশিত:

NSArray *arr=[NSArray array];
[arr objectAtIndex:100];

আইওএস 4 এ, আমি হেক্স নম্বরগুলির একটি দরকারী স্ট্যাক ট্রেস পাই। তবে আইওএস 5 এ এটি কেবল আমাকে দেয়:

*** First throw call stack:
(0x16b4052 0x1845d0a 0x16a0674 0x294c 0x6f89d6 0x6f98a6 0x708743 0x7091f8 0x7fcaa9 0x2257fa9 0x16881c5 0x15ed022 0x15eb90a 0x15eadb4 0x15eaccb 0x6f02a7 0x6faa93 0x2889 0x2805)

ধন্যবাদ।

উত্তর:


256

আমি যা চেষ্টা করেছি কিছুই এটি সমাধান করতে পারে না (আইওএস 5 আপডেটের জন্য এক্সকোড আপগ্রেড করার পরে, উভয় সংকলক, উভয় ডিবাগার, ইত্যাদি চেষ্টা করে) কোনও স্ট্যাকের চিহ্ন কাজ করছে বলে মনে হয় না।

যাইহোক, আমি একটি কার্যকর কাজের আশেপাশে খুঁজে পেয়েছি - আমার নিজস্ব ব্যতিক্রম হ্যান্ডলার তৈরি করে (যা অন্যান্য কারণেও কার্যকর)। প্রথমে একটি ফাংশন তৈরি করুন যা ত্রুটিটি পরিচালনা করবে এবং এটিকে কনসোলে আউটপুট করবে (পাশাপাশি আপনি এর সাথে আরও যা কিছু করতে চান):

void uncaughtExceptionHandler(NSException *exception) {
    NSLog(@"CRASH: %@", exception);
    NSLog(@"Stack Trace: %@", [exception callStackSymbols]);
    // Internal error reporting
}

এর পরে, আপনার অ্যাপের প্রতিনিধিটিতে ব্যতিক্রম হ্যান্ডলারটি যুক্ত করুন:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{   
    NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler);
    // Normal launch stuff
}

এটাই!

যদি এটি কাজ না করে, তবে কেবল দুটি সম্ভাব্য কারণ রয়েছে :

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

1
এটি শুনে খুশি হলাম :) ক্র্যাশ লগটি কোনও ফাইলে লিখতে আমি এটি দরকারী বলে মনে করি এবং ব্যবহারকারীকে পরবর্তী প্রবর্তনটিতে (কেবল রিলিজ মোডে, ডিবাগিংয়ের পথে না যাওয়ার জন্য) এটি জমা দেওয়ার অনুরোধ জানায়। এটি আমাকে দুর্দান্ত বাগের প্রতিবেদনগুলি পেতে দেয় ... এবং ব্যবহারকারীরা জানেন যে তাদের সমস্যার সমাধান করা হচ্ছে :)
জেন ক্লেস

2
এটি কাজ করে বলে মনে হচ্ছে না - uncaughtExceptionHandlerরুটিনটি কখনই চাওয়া হয় না।
হট লিক্স

1
আপনি কীভাবে এটি ব্যবহার করবেন সে সম্পর্কে আরও নির্দিষ্ট করে বলতে পারেন? এটি আমার পক্ষে কাজ করবে বলে মনে হয় না।
দানুত প্রলেয়া

1
খুব দু: খজনক এক্সকোড এটি আমাদের জন্য প্রদর্শন করে না।
লেখক অপাটিরা

1
অনেক প্রশংসিত! এটা অবাক করে দিচ্ছে যে অ্যাপল আইডিইতে এই ধরণের প্রাথমিক কর্মক্ষমতা প্রয়োগ করে না।
devios1

110

একটি ব্যতিক্রম ব্রেকআপপয়েন্ট যুক্ত করার জন্য একটি দরকারী বিকল্প রয়েছে (ব্রেকপয়েন্ট ন্যাভিগেটরের নীচে + ব্যবহার করে)। এটি যে কোনও ব্যতিক্রম (বা আপনি শর্ত নির্ধারণ করতে পারেন) বিরতি দেবে। আমি জানি না যে এই পছন্দটি ৪.২-এ নতুন কিনা বা অবশেষে আমি লক্ষ্য করেছি যে এটি অনুপস্থিত চিহ্নগুলির সমস্যার সমাধান করার চেষ্টা করছে।

একবার আপনি এই ব্রেকপয়েন্টে চাপ দিলে আপনি কল স্ট্যাক নেভিগেট করতে, ভেরিয়েবলগুলি পরীক্ষা করতে, ডাবল নেভিগেটরটি যথারীতি ব্যবহার করতে পারেন।

আপনি যদি অনুলিপি / পেস্টিং বা এই জাতীয় পছন্দগুলির জন্য উপযুক্ত একটি প্রতীকী কল স্ট্যাক চান, তবে জিডিবি ব্যাকট্রেস সেখান থেকে ভাল কাজ করবে:

(gdb) bt
#0  0x01f84cf0 in objc_exception_throw ()
#1  0x019efced in -[NSObject doesNotRecognizeSelector:] ()

(ইত্যাদি)


3
এটি এখনও পর্যন্ত আমার পক্ষে পুরোপুরি কাজ করে। ডিবাগারটি ক্র্যাশিং লাইনে এখন থামছে, ব্যাকট্রেসের প্রয়োজন নেই।
টিম

1
এটি পুরোপুরি আমার পক্ষেও কাজ করে। আপনাকে অনেক ধন্যবাদ, আমি এই ব্রেকপয়েন্ট ছাড়া পাগল হয়ে যাচ্ছিলাম ...
উইলিয়াম ডেনিস

এটি কাজ করার জন্য +1। এটি আপনাকে ব্যতিক্রমের কারণ ব্যাখ্যা করে এত সুন্দর ত্রুটি বার্তা দেয় না, তবে এটি একটি সূচনা ...
নিকু সুরডু

আপনি আমার হটডি @ বুদ্ধিমান ওল্ডাক
ম্যাভারিক 1

এটি আমার জন্য প্রত্যাশিত আচরণ পুনরুদ্ধার করে। দ্রষ্টব্য: এছাড়াও নতুন প্রকল্পগুলিতে এই ব্রেকপয়েন্টটি পুনরায় যুক্ত করতে মনে রাখবেন!
মেচেথন

46

ডিবাগারটিতে একটি নতুন বৈশিষ্ট্য রয়েছে। আপনি যখনই একটি ব্যতিক্রম নিক্ষেপ করেন তখন ব্রেক ব্রেক পয়েন্ট নির্ধারণ করতে পারেন এবং ঠিক সেখানেই কার্যকর করা বন্ধ করতে পারেন, যেমনটি এটি 4.0 এর আগে ঘটেছিল।

"ব্রেকপয়েন্ট পয়েন্ট নেভিগেটর" এ, একটি "এক্সেপশন ব্রেকপয়েন্ট" যুক্ত করুন এবং বিকল্পগুলির পপআপের জন্য "সম্পন্ন" টিপুন।

এখানেই শেষ!

PS: কিছু ক্ষেত্রে কেবলমাত্র উদ্দেশ্য-সি ব্যতিক্রমগুলির জন্য ব্রেক করা ভাল।


অবশ্যই এটি আমার জন্য সমাধান।
bradgonesurfing

এটা আমার জন্য সমস্যা ছিল। একজন সহকর্মী এবং আমি একই এক্সকোড প্রকল্পটি ভাগ করি এবং আমি তাকে জিজ্ঞাসা করি যে তার সমস্যা আছে কিনা, এবং তিনি ছিলেন না। পার্থক্যটি হ'ল তার প্রকল্পটি অবজেক্টি-সি ব্যতিক্রম (অবজেক্ট_ এক্সসেপশন_থ্রো)
ঘোড়া

আপনি কেবল একটি অবিরতযোগ্য বাগ খুঁজে পেতে সহায়তা করেছেন। তোমাকে অনেক ধন্যবাদ. আমি এই জাতীয় কিছু জন্য সর্বত্র খুঁজছেন।
rjgonzo

1
এটি একটি মোহন মত কাজ করে! ঠিক এটিই আমি সন্ধান করছিলাম, ব্যতিক্রম হ্যান্ডলার যুক্ত করার চেয়ে এটি ভাল, যেহেতু ব্রেকপয়েন্টটি যুক্ত করা ব্যতিক্রম যেখানে ছুঁড়েছে ঠিক সেখানে নিয়ে যেতে পারে, ব্যতিক্রম হ্যান্ডলার কাজ করে তবে আপনাকে কেবল একটি ধারণা দেয়।
im8bit

21

এখানে আরও একটি সমাধান রয়েছে যা পূর্বের মতো মার্জিত নয়, তবে আপনি যদি ব্যতিক্রম ব্রেকপয়েন্ট বা হ্যান্ডলারগুলি না যোগ করেন তবে এটি কেবল যাওয়ার একমাত্র উপায় হতে পারে।
যখন অ্যাপ ক্রাশ হয়ে যায় এবং আপনি আপনার কাঁচা প্রথম থ্রো কল স্ট্যাক (হেক্স নম্বরগুলিতে) পেয়ে যান, এক্সকোড কনসোলে টাইপ করুন info line *hex(তারকা এবং 0xহেক্স স্পেসিফারকে ভুলে যাবেন না ), উদাহরণস্বরূপ:

(gdb) info line *0x2658
Line 15 of "path/to/file/main.m" starts at address 0x25f2 <main+50>
and ends at 0x267e <main+190>.

আপনি যদি এলএলডিবি ব্যবহার করে থাকেন তবে আপনি টাইপ করতে পারেন image lookup -a hex(এই পরিস্থিতিতে তারা ছাড়া), এবং আপনি একই রকম আউটপুট পান।

এই পদ্ধতির সাহায্যে আপনি আপনার ফাংশনটিতে নিক্ষেপ স্ট্যাকের উপরে (প্রায় 5-7 সিস্টেম ব্যতিক্রম প্রচারকারী থাকবেন) উপরের দিকে যেতে পারেন যা ক্রাশের কারণ হয়ে দাঁড়িয়েছে এবং সঠিক ফাইল এবং কোডের লাইন নির্ধারণ করতে পারে।

এছাড়াও, অনুরূপ প্রভাবের জন্য আপনি টার্মিনালে atos ইউটিলিটি ব্যবহার করতে পারেন, কেবল টাইপ করুন:

atos -o path/to/AplicationBundle.app/Executable 0xAdress1 0xAdress2 0xAdress3 ...

এবং আপনি প্রতীকী স্ট্যাক ট্রেস পাবেন (কমপক্ষে আপনার ডিবাগ প্রতীক রয়েছে এমন ফাংশনগুলির জন্য)। এই পদ্ধতিটি আরও পছন্দসই, কারণ আপনার প্রতিটি ঠিকানা ঠিকানা নেই info line, কেবল কনসোল আউটপুট থেকে অ্যাড্রেসগুলি অনুলিপি করুন এবং সেগুলি টার্মিনালে আটকান।


9

আপনি একটি ব্যতিক্রম ব্রেকআপপয়েন্ট যুক্ত করতে পারেন (ব্রেকপয়েন্ট ন্যাভিগেটরের নীচে + ব্যবহার করে) এবং এতে ক্রিয়া যুক্ত bt করতে পারেন (ক্রিয়া যুক্ত করুন বোতামটি ক্লিক করুন, ডিবাগার কমান্ড নির্বাচন করুন, পাঠ্য ক্ষেত্রে "বিটি" লিখুন)। এটি একটি ব্যতিক্রম ছোঁড়ার সাথে সাথে স্ট্যাক ট্রেস প্রদর্শন করবে।


6

এটি একটি সাধারণ সমস্যা, ৪.২-তে স্ট্যাক ট্রেস না পাওয়া। আপনি আরও ভাল ফলাফল পান কিনা তা দেখতে আপনি এলএলডিবি এবং জিডিবির মধ্যে অদলবদল করতে চেষ্টা করতে পারেন।

এখানে একটি বাগ রিপোর্ট ফাইল করুন।

http://developer.apple.com/bugreporter/

সম্পাদনা করুন:

আমি বিশ্বাস করি আপনি যদি এলএলভিএম জিসিসি ৪.২ এ ফিরে যান তবে আপনি এটিকে দেখতে পাবেন না। আপনার প্রয়োজনীয় বৈশিষ্ট্যগুলি হারাতে পারেন।


হ্যাঁ আমি কম্পাইলারগুলি স্যুইচ করার চেষ্টা করেছি, তবে সমস্যাটি রয়ে গেছে। তবে যাইহোক ধন্যবাদ :)
cekisakurek

তিনি সংশোধনকারী নয়, ডিবাগারগুলি স্যুইচ করার পরামর্শ দিয়েছেন।
bames53

1
এফওয়াইআই: এই উদাহরণস্বরূপ, আপনি যে সংকলকটি ব্যবহার করছেন বা ডিবাগারের সংস্করণের সাথে এর কোনও সম্পর্ক নেই। এটি আইওএস থেকে কনসোল আউটপুট পরিবর্তন a
ক্লার্ককক্স 3

এটির কতটা অভিজ্ঞতা পরিবর্তিত হয় আকর্ষণীয় - আমি মনে করি এখানে কয়েকটি সমস্যা রয়েছে। আমি ব্যতিক্রম ব্রেকপয়েন্টে থামাতে ডিবাগারটি পেতে সক্ষম হইনি। জিডিবি থেকে এলএলডিবিতে স্যুইচ করা সমস্যার সমাধান করেছে।
ম্যাট

6

আপনার মূল ফাংশনে এই কোডটি ব্যবহার করুন:

int main(int argc, char *argv[])
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    int retVal;
    @try {
        retVal = UIApplicationMain(argc, argv, nil, nil);
    }
    @catch (NSException *exception) {
        NSLog(@"CRASH: %@", exception);
        NSLog(@"Stack Trace: %@", [exception callStackSymbols]);
    }
    @finally {
        [pool release];
    }
    return retVal;
}

এটি স্টোরিবোর্ডগুলির সাথে কাজ করে বলে মনে হচ্ছে না। 2012-06-04 20: 34: 52.211 সমস্যাগুলি [1944: 207] অ্যাপের প্রতিনিধি যদি উইন্ডোটির সম্পত্তিটি কোনও মূল স্টোরিবোর্ড ফাইলটি ব্যবহার করতে চায় তবে অবশ্যই তা বাস্তবায়ন করতে হবে। 2012-06-04 20: 34: 52.213 সমস্যা [1944: 207] অ্যাপ্লিকেশন প্রবর্তনের শেষে অ্যাপ্লিকেশনগুলির একটি রুট ভিউ কন্ট্রোলার থাকবে বলে আশা করা হচ্ছে
ম্যাকাসাস

6

এক্সকোডের ডিবাগ কনসোল প্রম্পটে টাইপ করুন:

image lookup -a 0x1234

এবং এটি আপনাকে এরকম কিছু দেখাবে:

  Address: MyApp[0x00018eb0] (MyApp.__TEXT.__text + 91088)
  Summary: MyApp`-[MyViewController viewDidAppear:] + 192 at MyViewController.m:202

ধন্যবাদ, আমি সত্যিই এটি খুঁজছিলাম। আশ্চর্যজনক যে পুরো "ফার্স্ট থ্রো কল স্ট্যাক" কে কল স্ট্যাক হিসাবে প্রদর্শন করার জন্য কোনও শর্টকাট নেই, কারণ আমি অনুমান করি পাইথন এলএলডিবি স্ক্রিপ্টটি সহজেই লেখা যায়।
ইলিয়া

1

'কমপাইল ফর থাম্ব' ফিরিয়ে দেওয়া (ডিবাগ কনফিগারেশন) আমার পক্ষে কাজ করেছে।

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