दिलचस्प पोस्ट
कौन सा पाश बेहतर प्रदर्शन है? क्यूं कर? टर्नरी ऑपरेटर का उपयोग करके विधि कॉल ब्राउज़र टैब / विंडो के बीच जावास्क्रिप्ट संचार रीसाइज़िंग विंडो के दौरान ऑटो आकार का आकार (फ़ॉन्ट आकार)? सी ++ ऑपरेटरों में अंतर्निहित प्रकार रूपांतरण नियम कैसे जावास्क्रिप्ट के साथ एक मोबाइल डिवाइस का पता लगाने के लिए? क्या node.js के लिए एक नौकरी अनुसूचक पुस्तकालय है? जिपरअर्चिव अमान्य ज़िप फ़ाइल बनाता है क्लिक करने पर छवि फ़ाइलों को डाउनलोड करने के लिए ब्राउज़र को बल दें छवि को वेबसाइट से स्थानीय फ़ाइल में खींचने के लिए httpwebrequest का उपयोग कैसे करें क्रोम के साथ विशिष्ट फाइल सिस्टम स्टोरेज स्टोर कहां से आता है? तुलनित्र के रूप में सदस्य समारोह का उपयोग कर समस्या छँटाई तालिका से जानकारी चुनें जहां पंक्ति की अधिकतम तिथि है आईओएस – ViewController से ऐप डेलेगेट विधि कॉलिंग हेडर फाइलों में वैरिएबल घोषणा – स्थिर या नहीं?

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

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

जिन चीजों में मैं करना चाहता हूं उनमें से एक लॉग होता है जो ऐप रन होने पर उस तरीके को मिलते हैं। मैंने एक कस्टम 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__);