আপনি কীভাবে কোকোতে কনসোল / লগের স্ট্যাক ট্রেস মুদ্রণ করবেন?


293

আমি কিছু পয়েন্টের সময় কল ট্রেস লগ করতে চাই, যেমন ব্যর্থ উক্তি, বা ব্যতীত ব্যতিক্রম।

উত্তর:


544
 NSLog(@"%@",[NSThread callStackSymbols]);

এই কোডটি কোনও থ্রেডে কাজ করে।


14
ম্যাক ওএস এক্স 10.6 এ নতুন, যা এই প্রশ্নটি মূলত জিজ্ঞাসা করার সময় উপস্থিত ছিল না। প্রাক-স্নো-চিতাবাঘের জন্য, backtraceএবং backtrace_symbolsফাংশনগুলি ব্যবহার করুন ; ব্যাকট্রিজ (3) ম্যানপেজ দেখুন।
পিটার হোসি

6
কেবলমাত্র আইওএস 4.0 এবং উপরের।
ডানরা

ধন্যবাদ! এটি কেবল স্ট্যাক ট্রেস প্রিন্ট করার কোনও উপায় আছে, বলুন, সমস্ত পথের পরিবর্তে 6 স্তর নীচে রেখেছেন?
সুডো

9000, backtrace/backtrace_symbolsসরাসরি ব্যবহার করুন
ডায়মভ

34

n13 এর উত্তরটি বেশ কার্যকর হয়নি - আমি এটিকে সামনে আসতে সামান্য পরিবর্তন করেছি

#import <UIKit/UIKit.h>

#import "AppDelegate.h"

int main(int argc, char *argv[])
{
    @autoreleasepool {
        int retval;
        @try{
            retval = UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
        }
        @catch (NSException *exception)
        {
            NSLog(@"Gosh!!! %@", [exception callStackSymbols]);
            @throw;
        }
        return retval;
    }
}

4
গাহ ... অ্যাপলিকে কমপক্ষে কোনও অ্যাপ্লিকেশন বিকাশের সময় এটিকে একটি স্ট্যান্ডার্ড করা উচিত। একগুচ্ছ স্মৃতি ঠিকানা হ'ল ... প্রতীক
রাশ

আমি আমার উত্তরে আপনার উন্নতিগুলি রেখেছি; আমি এটিআরসি এর আগে করেছি। ধন্যবাদ।
n13

1
এটি সব পরিস্থিতিতে কাজ করে না । আপনি যদি অবিচ্ছিন্ন সমস্ত ব্যতিক্রমগুলি ধরতে চান তবে এটি একটি আরও ভাল উপায়: কোডরেভিউ.স্ট্যাকেক্সেঞ্জার / প্রশ্নস / ৫616262২/২ (এই প্রশ্নের কোডটি কিছুটা অতি-জটিল but
nhgrif

আপনি NSLog(@"[Error] - %@ %@", exception.name, exception.reason);যদি আসল ব্যতিক্রমও চান তবে আপনি যোগ করতে পারেন
কোরেন্টিন এস

9

কোকো ইতিমধ্যে কনসোলে ব্যতীত ব্যতিক্রম স্ট্যাক ট্রেস লগ ইন করে যদিও তারা কেবল কাঁচা মেমরি ঠিকানা। আপনি যদি কনসোলে প্রতীকী তথ্য চান তবে কিছু নমুনা কোড রয়েছে অ্যাপল থেকে ।

যদি আপনি আপনার কোডের একটি স্বেচ্ছাসেবী বিন্দুতে স্ট্যাক ট্রেস তৈরি করতে চান (এবং আপনি চিতাবাঘের উপরে আছেন), ব্যাকট্র্যাস ম্যান পৃষ্ঠাটি দেখুন। চিতাবাঘের আগে, আপনাকে কল স্ট্যাকের মাধ্যমেই খনন করতে হয়েছিল।


6
স্পষ্টতই আইওএস 4 এ উপলব্ধ তবে 3.2 নয়। আমি যা ব্যবহার করেছি তা এখানে, নির্লজ্জভাবে ব্যাকট্রেস ম্যান পৃষ্ঠা থেকে অনুলিপি করা হয়েছে: int i, ফ্রেমস = ব্যাকট্র্যাস (কলস্ট্যাক, 128); চর ** strs = backtrace_symbols (কলস্ট্যাক, ফ্রেম); (i = 0; i <ফ্রেম; ++ আমি) {প্রিন্টফ ("% s \ n", স্টারস [i]) এর জন্য; } ফ্রি (স্টারস);
মহড়্পার

হ্যান্ডলেক্সেপশনে ডাকা হওয়ায় এটি হ্যান্ডলারের কার্যকারিতাটি নিজেই খুঁজে পেয়েছে, [[এনএসইসেপশন কলস্ট্যাক সিম্বলস]] যেখানে ব্যতিক্রম উত্থাপিত হয়েছে সেখানে স্ট্যাক দেখায়। তবে আপনি যদি "ব্যাকট্রেস (...)" এর সাথে প্রতিস্থাপন করেন: "এনএসআর অ্যারে = [প্রাক্তন কলস্ট্যাক রিটার্ন অ্যাড্রেসস]; ইন্ট ফ্রেমস = আরআরকন্ট;; এর জন্য (i = 0; i <ফ্রেমস; ++ i) কলস্ট্যাক [i] = ( অকার্যকর) [((এনএসএনম্বার *) [আরর অবজেক্টটিআইটেক্স: আই]) ইনটভ্যালু] " আপনি বর্তমান ব্যতিক্রম স্ট্যাক ট্রেস পাবেন। [এনএসইসেপশন কলস্ট্যাকসাইমবলস] এভাবেই কাজ করে, আমি মনে করি: তারা ফিরে আসার চিহ্নগুলি সমান এবং উভয় অ্যাপ্লিকেশন কলগুলিতে মুক্তির ক্ষেত্রে _mh_execute_header দ্বারা প্রতিস্থাপন করা হয়।
টার্মিয়াম

6

এটি আপনাকে অনেক কি করতে হবে তা বলে।

মূলত আপনাকে লগ করতে অ্যাপ্লিকেশন ব্যতিক্রম হ্যান্ডলিং সেট আপ করতে হবে, এরকম কিছু:

#import <ExceptionHandling/NSExceptionHandler.h>

[[NSExceptionHandler defaultExceptionHandler] 
                  setExceptionHandlingMask: NSLogUncaughtExceptionMask | 
                                            NSLogUncaughtSystemExceptionMask | 
                                            NSLogUncaughtRuntimeErrorMask]

1
দ্রষ্টব্য, যদিও এটি কেবলমাত্র একটি নিবন্ধিত ব্যতিক্রম হ্যান্ডলারের মধ্যে কাজ করবে (উদাহরণস্বরূপ, @ ক্যাচ ব্লকে নয়)
ব্যারি ওয়ার্ক

2

ব্যতিক্রমগুলির জন্য, আপনি এটি করতে ব্যতিক্রম ব্যবহারকারীর ইনফো অভিধানের সদস্য এনএসএসট্যাকট্রেসকি ব্যবহার করতে পারেন। অ্যাপলের ওয়েবসাইটে ব্যতিক্রমগুলির জন্য কোনও প্রোগ্রামের প্রতিক্রিয়া নিয়ন্ত্রণ করা দেখুন ।


কীভাবে সুইফটে ব্যবহার করবেন?
পেড্রো পাওলো আমোরিম

1

দ্রুত প্রিন্টে এইভাবে:

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