दिलचस्प पोस्ट
एसिंक पद्धति को कॉल करना सिंक्रोनस रूप से मैं iPhone पर प्रोग्राम को एक छवि कैसे दिखाऊंगा? प्रपत्र के समापन ईवेंट पर पृष्ठभूमिवर्कर कैसे रोकें? डुप्लिकेट डिक्ट इन पायथन में सूची निकालें बिटमैप के साथ मेमोरी त्रुटि से बाहर समय के साथ GameObject को स्थानांतरित करें आदिम और संदर्भ प्रकारों के बीच अंतर क्या है? कच्चे_इनपुट और टाइमआउट एक फ़ाइल का एक MD5 चेकसम उत्पन्न करना सी ++ में "अनुवाद इकाई" क्या है मैं NSArray को उद्देश्य-सी में कैसे बदल सकता हूँ? Google Maps API V3 Infobox.js हटा दिया गया जब मेरी क्रैश हो जाती है तो मेरी प्रक्रिया के लिए मिनीडम्प कैसे बनाएं? क्या मैं आईफ़ोन या एंड्रॉइड पर HTML5 के साथ मूल फ़ुलस्क्रीन वीडियो प्लेयर से बच सकता हूं? JavaScript में सरणी के माध्यम से लूप

आईओएस एप में प्रयुक्त सभी तरीकों को कैसे लॉग किया जाए

मैं एक ग्राहक के लिए एक आईपैड ऐप का विकास कर रहा हूं। काम का एक बड़ा हिस्सा है जो पहले से ही किया गया है और मैं एक साथ टुकड़े करने की कोशिश कर रहा हूं कि पूरी चीज को चलाने के लिए कैसे तैयार किया गया है।

जिन चीजों में मैं करना चाहता हूं उनमें से एक लॉग होता है जो ऐप रन होने पर उस तरीके को मिलते हैं। मैंने एक कस्टम DTrace स्क्रिप्ट देखा है जिसका मतलब स्टार्टअप से सभी तरीकों से लॉग इन करना है, लेकिन जब मैं इसे उपकरण में चलाता हूं तब मुझे कोई परिणाम नहीं मिलता।

तरीकों को प्रवेश करने का सबसे अच्छा तरीका क्या है?

वेब के समाधान से एकत्रित समाधान "आईओएस एप में प्रयुक्त सभी तरीकों को कैसे लॉग किया जाए"

टीसी के उत्तर से इसी तरह के सवाल का जवाब देने के लिए, मैं एक डिबग ब्रेकपॉइंट कार्रवाई कर रहा हूं जो आपके आवेदन में हर बार objc_msgSend () शुरू होने के लिए कक्षा और विधि नाम को लॉग आउट कर देगा। यह इस उत्तर में वर्णित डीटी्रेस स्क्रिप्ट के समान काम करता है I

इस ब्रेकपॉइंट क्रिया को सक्षम करने के लिए, एक नया प्रतीकात्मक ब्रेकपॉइंट बनाएं (एक्सकोड 4 में, ब्रेकपेज नेविगेटर पर जाएं और विंडो के निचले बाएं भाग में प्लस का उपयोग करके एक नया प्रतीकात्मक ब्रेकपॉइंट बनाएं)। प्रतीक को objc_msgSend होना objc_msgSend , उसे क्रियाओं के मूल्यांकन के बाद स्वचालित रूप से जारी रखने के लिए सेट करें, और निम्नलिखित का उपयोग करके डीबगर आदेश होने के लिए कार्य सेट करें:

 printf "[%s %s]\n", (char *)object_getClassName(*(long*)($esp+4)),*(long *)($esp+8) 

आपका ब्रेकपॉइंट निम्न की तरह कुछ दिखना चाहिए:

ब्रेकपॉइंट एक्शन

आपके आवेदन के खिलाफ चलते समय इस तरह के संदेशों को लॉग आउट करना चाहिए:

 [UIApplication sharedApplication] [UIApplication _isClassic] [NSCFString getCString:maxLength:encoding:] [UIApplication class] [SLSMoleculeAppDelegate isSubclassOfClass:] [SLSMoleculeAppDelegate initialize] 

अगर आप सोच रहे हैं कि मैंने मेमोरी पते को कहाँ खींच लिया है, तो उद्देश्य-सी रनटाइम इन्टरल्स पर इस फारेक लेख को पढ़ें। उपरोक्त मेमोरी पते केवल सिम्युलेटर के खिलाफ काम करेगा, इसलिए आपको आईओएस उपकरणों पर एप्लिकेशन के खिलाफ चलाने के लिए इसे ज़ूम करने की आवश्यकता हो सकती है। कॉलिन डिवाइस पर इसे चलाने के लिए उसके उत्तर में निम्नलिखित संशोधन का सुझाव देते हैं:

 printf "[%s %s]\n", (char *)object_getClassName($r0),$r1 

इसके अलावा, मुझे लगता है कि आप देखेंगे कि आपके आवेदन में बुलाया गया हर पद्धति को लॉग आउट करने से आपको जानकारी के साथ डूब जाएगा आप इसे फ़िल्टर करने के लिए कुछ शर्तों का उपयोग करने में सक्षम हो सकते हैं, लेकिन मुझे नहीं पता कि यह आपकी मदद करेगा कि आपका कोड कैसे कार्यान्वित होगा।

यदि आप एलएलडीबी का प्रयोग कर रहे हैं, तो आपको निम्न डीबगर कमांड का उपयोग करना होगा। ये एक्सकोड 4.6 में परीक्षण किया गया था।

डिवाइस:

 expr -- (void) printf("[%s %s]\n", (char *)object_getClassName($r0),$r1) 

सिम्युलेटर:

 expr -- (void) printf("[%s %s]\n", (char *)object_getClassName(*(long*)($esp+4)), *(long *)($esp+8)) 

ब्रैड लार्सन के दृष्टिकोण को डीबगर आदेश का उपयोग करके डिवाइस पर चलाने के लिए अनुकूलित किया जा सकता है:

 printf "[%s %s]\n", (char *)object_getClassName($r0),$r1 

अधिक जानकारी तकनीकी नोट में यहां पाई जा सकती है: टेक्नोट्स

डिवाइस पर Xcode 6 के अंतर्गत ऐप कोड का पता लगाने के लिए, मुझे निम्न डीबगर अभिव्यक्ति का उपयोग करना पड़ा।

 expr -- (void) printf("[%s %s]\n", (char *)object_getClassName($arg1),$arg2) 

बाद में एक्सकोड संस्करणों को आपको इस तरह कॉल करना होगा

 expr -- (void)printf("[%s, %s]\n",(char *) object_getClassName(*(long*)($esp+4)), (char *) *(long *)($esp+8) ) 

यदि आप आउटपुट को केवल एक वर्ग के भेजे गए संदेशों को सीमित करना चाहते हैं तो आप इस तरह एक शर्त जोड़ सकते हैं

(int) strcmp ((चार *) object_getClassName ($ r0), "NSString") == 0

एक साथी डेवलपर ने मुझे प्रत्येक विधि में एक ही दो लॉग स्टेटमेंट जोड़ने के लिए सिखाया। एक पहली पंक्ति के रूप में, दूसरी पिछली रेखा के रूप में मुझे लगता है कि उनकी एक स्क्रिप्ट है जो यह स्वचालित रूप से अपनी परियोजनाओं के लिए करती है, लेकिन परिणाम यह है:

 NSLog(@"<<< Entering %s >>>", __PRETTY_FUNCTION__); NSLog(@"<<< Leaving %s >>>", __PRETTY_FUNCTION__); 

कंसोल में, यह कुछ की तरह बाहर थूकना होगा:

  <<< Entering -[MainListTableViewController viewDidLoad] >>> 

क्या चल रहा है पर नज़र रखने में बहुत सहायक

यदि आप 64 बिट पर सिम्युलेटर में तरीकों को लॉग करना चाहते हैं, तो इसके बजाय निम्न कमांड का उपयोग करें:

 expr -- (void) printf("[%s %s]\n", (char *)object_getClassName($rdi), (char *) $rsi) 

या अगर वह काम नहीं करता है, तो इस तरीके से लॉग इन करें:

यहां छवि विवरण दर्ज करें

मुख्य विचार ऑब्जेक्ट (स्व) के लिए $ आरडीआई और चयनकर्ता के लिए $ आरएसआई का उपयोग करना है

 NSLog(@"%@", NSStringFromSelector(_cmd)); 

या

 NSLog(@"%s", __PRETTY_FUNCTION__);