2010-10-28 9 views
30

पर कॉलिंग फ़ंक्शन का नाम प्रिंट करें उद्देश्य-सी का रनटाइम अपेक्षाकृत मजबूत लगता है, इसलिए मैं सोच रहा था कि फ़ंक्शन के नाम को लॉग करने का कोई तरीका है जिसे वर्तमान फ़ंक्शन (डीबगिंग उद्देश्यों के लिए) कहा जाता है।डीबग लॉग

मेरी स्थिति यह है कि चीजों का एक गुच्छा एक संपत्ति को सौंपता है, और ब्रेकपॉइंट सेट करने और हर बार कॉल स्टैक की जांच करने के बजाय, मैं केवल NSLog संपत्ति को सेट करने वाले फ़ंक्शन का नाम चाहता हूं नए मूल्य के साथ।

तो क्या रनटाइम पर कॉल स्टैक तक पहुंच प्राप्त करना संभव है?

उत्तर

42

इस प्रयास करें:

#include <execinfo.h> 

void *addr[2]; 
int nframes = backtrace(addr, sizeof(addr)/sizeof(*addr)); 
if (nframes > 1) { 
    char **syms = backtrace_symbols(addr, nframes); 
    NSLog(@"%s: caller: %s", __func__, syms[1]); 
    free(syms); 
} else { 
    NSLog(@"%s: *** Failed to generate backtrace.", __func__); 
} 
+0

यदि आप 'sizeof (addr)' sizeof (addr)/sizeof (void *) '(या केवल 2) के साथ 'sizeof (addr)' को प्रतिस्थापित करते हैं तो यह बहुत अच्छा काम करता है। धन्यवाद! – Brian

+14

फिक्स्ड। ओह, और फाउंडेशन वास्तव में इसे वास्तव में '- [एनएसटीएचड कॉलस्टैकसिंबल्स]' के माध्यम से उजागर करता है, जो एक सरणी देता है। आप इसे 'NSArray * syms = [[NSThread currentThread] callStackSymbols] के रूप में उपयोग कर सकते हैं; अगर ([syms count]> 1) एनएसएलओजी (@ "कॉलर:% @", [syms objectAtIndex: 1U]; ' –

+5

अंतिम टिप्पणी: 'कॉलस्टैकसिंबल्स' एक क्लास विधि है। आपको इसे '[NSThread callStackSymbols]' के रूप में उपयोग करना होगा। – user102008

2

प्रेषक प्राप्त करने की कोई सुविधा नहीं है। या, कम से कम, उद्देश्य-सी के लिए कुछ भी केंद्रित नहीं है।

हालांकि कुछ विकल्प हैं।

सबसे पहले, आप जीडीबी कमांड का उपयोग कर सकते हैं। जीडीबी कंसोल पर जाएं और कुछ ऐसा करें:

comm 1 
bt 
po argName 
cont 

वैकल्पिक रूप से, आप dtrace का उपयोग कर सकते हैं। यह कठिन है। या आप इंस्ट्रूमेंट्स का उपयोग कर सकते हैं जो कुछ हद तक आसान बनाता है।

या आप बैकट्रैक() फ़ंक्शन का उपयोग कर सकते हैं। बैकट्रैक मैन पेज देखें (एक्स-मैन-पेज: // बैकट्रैक)।

0

एक सी मैक्रो है जिसे __PRETTY_FUNCTION__ कहा जाता है जो वर्तमान फ़ंक्शन के नाम से सी-स्ट्रिंग वापस कर देगा। आप आसानी से NSLog के लिए मुद्रण के लिए एक NSString करने के लिए कि कन्वर्ट करने के लिए चाहते हैं, तो आप

#define NSSTRING_PRETTY_FUNCTION [NSString stringWithCString:__PRETTY_FUNCTION__ encoding:NSASCIIStringEncoding] 

मैं इसे अपने परियोजनाओं में हर समय का उपयोग के साथ एक मैक्रो बना सकते हैं।

+4

आपने प्रश्न को ठीक से नहीं पढ़ा। यह आवश्यक फ़ंक्शन का नाम नहीं है, लेकिन कॉलर है। – JeremyP

30

बड़ा सवाल। ऊपर जेरेमी के उत्तर का संयोजन और हम हमेशा हमारे डीबगिंग के लिए उपयोग करते हैं, आपको इस तरह की अच्छी स्ट्रिंग मिल जाएगी:

NSArray *syms = [NSThread callStackSymbols]; 
if ([syms count] > 1) { 
    NSLog(@"<%@ %p> %@ - caller: %@ ", [self class], self, NSStringFromSelector(_cmd),[syms objectAtIndex:1]); 
} else { 
    NSLog(@"<%@ %p> %@", [self class], self, NSStringFromSelector(_cmd)); 
} 
+0

कहीं भी कोड के इस टुकड़े को कॉल करने की आवश्यकता है? – Shamsiddin

+0

हां, आपको इसे संबंधित फ़ंक्शन में कॉल करने की आवश्यकता है जहां आप लॉग करना चाहते हैं कॉल करें – LordT

+0

जैसा आपने कहा था मैंने किया, लेकिन उसने सभी हिस्ट मुद्रित नहीं किए काम के तरीकों की ओर से परियोजना चलाने से शुरू होता है। – Shamsiddin

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