2008-10-20 13 views

उत्तर

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

यह कोड किसी भी धागे पर काम करता है।

+13

मैक ओएस एक्स 10.6 में नया, जो तब मौजूद नहीं था जब इस सवाल को मूल रूप से पूछा गया था। प्री-हिम-तेंदुए के लिए, 'बैकट्रैक' और 'बैकट्रैस_सिम्बोल्स' फ़ंक्शंस का उपयोग करें; बैकट्रैक (3) मैनपेज देखें। –

+3

आईओएस में भी काम करता है। –

+5

केवल आईओएस 4.0 और उसके बाद के संस्करण पर। – Danra

6

This आपको बहुत कुछ बताता है कि क्या करना है।

#import <ExceptionHandling/NSExceptionHandler.h> 

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

नोट –

2

अपवाद के लिए, आप यह करने के लिए अपवाद के userInfo शब्दकोश की NSStackTraceKey सदस्य का उपयोग कर सकते हैं:

अनिवार्य रूप से आप लॉग इन करने से निपटने के अनुप्रयोगों अपवाद की तरह कुछ स्थापित करने के लिए की जरूरत है। ऐप्पल की वेबसाइट पर Controlling a Program's Response to Exceptions देखें।

9

कोको पहले ही कंसोल के लिए अपरिपक्व अपवादों पर स्टैक ट्रेस लॉग करता है हालांकि वे केवल कच्चे मेमोरी पते हैं। यदि आप कंसोल में प्रतीकात्मक जानकारी चाहते हैं तो ऐप्पल से कुछ sample code है।

यदि आप अपने कोड में एक मनमानी बिंदु पर एक स्टैक ट्रेस उत्पन्न करना चाहते हैं (और आप तेंदुए पर हैं), बैकट्रैक मैन पेज देखें। तेंदुए से पहले, आपको वास्तव में कॉल स्टैक के माध्यम से खोदना पड़ा था।

+6

आने के लिए, हालांकि है कि यह केवल एक पंजीकृत अपवाद संचालक के भीतर (नहीं, जैसे, एक @catch ब्लॉक में) काम करेंगे स्पष्ट रूप से आईओएस 4 में उपलब्ध है लेकिन 3.2 नहीं। यहाँ मैं क्या करता था, बेशर्म पश्व-अनुरेखन आदमी पेज से कॉपी किया है: # शामिल ... शून्य * callstack [128]; int i, frames = backtrace (कॉलस्टैक, 128); char ** strs = backtrace_symbols (कॉलस्टैक, फ्रेम); (i = 0; i mharper

+0

हैंडलएक्सप्शन में बुलाया जाने पर यह हैंडलर फ़ंक्शन के पीछे ट्रेस लिखता है, जबकि [एनएसईएक्सप्शन कॉलस्टैकसिंबल्स] उस स्थान के ढेर को दिखाता है जहां अपवाद उठाया गया है। लेकिन अगर आप "बैकट्रैक (...)" को प्रतिस्थापित करते हैं: "एनएसएआरएआरएआर एआर = [पूर्व कॉलस्टैकरेटर्न एड्रेस्रेस]; int frames = arr.count; (i = 0; i Tertium

33

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; 
    } 
} 
+2

अच्छा दृष्टिकोण! मैं इस प्रकार के कोड के लिए लंबे समय से खोज रहा था। – NightFury

+1

गह ... ऐप्पल को एप्लिकेशन को विकसित करते समय कम से कम एक मानक बनाना चाहिए। स्मृति पते का एक गुच्छा है ... पुरातन – Russ

+0

मैंने आपके जवाब में अपने सुधार डाले; मैंने एआरसी से पहले ऐसा किया था। धन्यवाद। – n13

संबंधित मुद्दे