आप कोको में कंसोल / लॉग में स्टैक ट्रेस कैसे प्रिंट करते हैं?


293

मैं कुछ बिंदुओं के दौरान कॉल ट्रेस लॉग करना चाहूंगा, जैसे विफल दावे, या बिना अपवाद अपवाद।

जवाबों:


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

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


14
मैक ओएस एक्स 10.6 में नया, जो इस सवाल के मूल रूप से पूछे जाने पर मौजूद नहीं था। प्री-स्नो-लेपर्ड के लिए, backtraceऔर backtrace_symbolsकार्यों का उपयोग करें ; बैकट्रेस (3) मैनपेज देखें।
पीटर होसी

6
केवल iOS 4.0 और इसके बाद के संस्करण पर।
दानरा

धन्यवाद! क्या यह केवल स्टैक ट्रेस को प्रिंट करने का एक तरीका है, कहते हैं, सभी स्तरों के बजाय 6 स्तर नीचे हैं?
सूदो

9000, backtrace/backtrace_symbolsसीधे उपयोग
dymv

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
जीए ... ऐप्पल को विकसित करते समय ऐप्पल को इसे कम से कम एक मानक बनाना चाहिए। स्मृति पतों का एक गुच्छा है ... पुरातन
Russ

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

1
यह सभी स्थितियों में काम नहीं करता है। यह एक बेहतर तरीका है अगर आप सभी अनकैप्ड अपवादों को पकड़ना चाहते हैं: codereview.stackexchange.com/questions/56162/… (उस प्रश्न में कोड थोड़ा अधिक ओवरकम्प्लीट है, लेकिन यह कॉल स्टैक प्रतीकों को लॉग करने से भी अधिक है।)
नृगिफ़

NSLog(@"[Error] - %@ %@", exception.name, exception.reason);यदि आप वास्तविक अपवाद भी चाहते हैं तो आप जोड़ सकते हैं
कॉर्टिन एस।

9

कोको पहले से ही कंसोल में बिना किसी अपवाद के स्टैक ट्रेस लॉग करता है, हालांकि वे सिर्फ कच्चे मेमोरी एड्रेस हैं। यदि आप सांत्वना में प्रतीकात्मक जानकारी चाहते हैं तो Apple का कुछ नमूना कोड है।

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


6
आईओएस 4 में स्पष्ट रूप से उपलब्ध है, लेकिन 3.2 नहीं। यहाँ मैंने जो प्रयोग किया है, बेशर्मी से बैकट्रेस मैन पेज से कॉपी किया गया है: #include <execinfo.h> ... void * callstack [128]; int i, फ्रेम = बैकट्रेस (कॉलस्टैक, 128); char ** strs = backtrace_symbols (कॉलस्टैक, फ्रेम); के लिए (i = 0; मैं <फ्रेम; ++ i) {प्रिंटफ ("% s \ n", strs [i]); } free (strs);
एमएचआर

HandleException में कहा जाता है, यह हैंडलर फंक्शन का बैक ट्रेस खुद लिखता है, जबकि [NSException callStackSymbols] उस जगह का स्टैक दिखाता है, जहां अपवाद बढ़ा है। लेकिन अगर आप "backtrace (...)" की जगह लेते हैं: "NSArray arr = [ex callStackReturnAddresses]; int फ्रेम = arr.count; के लिए (i = 0; मैं <फ्रेम; ++ i) कॉलबैक [i] = (; शून्य) [((NSNumber *) [arr objectAtIndex: i]) intValue]; " आपको वर्तमान अपवाद स्टैक ट्रेस मिलेगा। यह है कि [NSException callStackSymbols] कैसे काम करता है, मुझे लगता है: वे जो रिटर्न देते हैं वह बराबर है और दोनों ऐप कॉल को रिलीज़ में _mh_execute_header द्वारा प्रतिस्थापित किया जाता है।
तृतीयां

6

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

अनिवार्य रूप से आपको लॉग इन करने के लिए एप्लिकेशन अपवाद हैंडलिंग सेट करने की आवश्यकता है, जैसे कुछ:

#import <ExceptionHandling/NSExceptionHandler.h>

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

1
ध्यान दें, हालांकि यह केवल एक पंजीकृत अपवाद हैंडलर के भीतर काम करेगा (नहीं, उदाहरण के लिए, एक @ ब्लॉक में)
बैरी वार्क

2

अपवादों के लिए, आप ऐसा करने के लिए अपवाद के userInfo शब्दकोश के NSStackTraceKey सदस्य का उपयोग कर सकते हैं। Apple की वेबसाइट पर अपवादों के लिए एक कार्यक्रम की प्रतिक्रिया को नियंत्रित करना देखें ।


स्विफ्ट में कैसे करें इस्तेमाल?
पेड्रो पाउलो अमोरिम

1

इस तरह से तेजी से प्रिंट में:

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