2009-07-09 20 views
15

में एक स्क्रीनसेवर को डीबग कैसे करें, मैं सोच रहा था कि ओएस एक्स में स्क्रीनसेवर ऐप बंडल को सही तरीके से डीबग करने के लिए एनएसएलओजी-आईएनजी के अलावा कोई अच्छा तरीका है या नहीं?ओएस एक्स

"स्क्रीनसेवर" एक्सकोड में एक प्रोजेक्ट प्रकार है, लेकिन स्पष्ट रूप से कोई बिल्ड और गो डिबगिंग नहीं है। इसके अलावा, मुझे पता चला है कि वास्तव में मेरा बंडल

/System/Library/Frameworks/ScreenSaver.framework/Versions/A/Resources/ScreenSaverEngine.app 

किसी प्रकार की प्लगइन के रूप में एप्लिकेशन में लोड हो रहा है।

तो क्या आपके कोड को डीबग करने का एक शानदार तरीका है? क्रैश रिपोर्ट और NSLog-ing को कंसोल पर देखकर मदद करता है, लेकिन यह बिल्कुल सही नहीं है।

उत्तर

10

स्क्रीन सेवर विकास चक्र का वर्णन करने वाला एक पुराना MacTech आलेख है। लेख में Part 2 भी है। "डिबगिंग टिप्स" अनुभाग में देखें।

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

+0

शानदार लिंक!मुझे नहीं पता कि मैं इसे खुद क्यों नहीं ढूंढ पाया :) –

+0

उस लेख के लिए Kuto's डेविड हिल (x-Apple DTS!) – geowar

+0

वह लेख तब से है जब मैकटेक डेवलपर्स के लिए पढ़ने योग्य था। जब मैंने अपना ध्यान आईटी पर स्विच किया तो मैंने सदस्यता रद्द कर दी। – Mark

1

जरूरी नहीं कि सबसे अच्छा तरीका है, लेकिन आप किसी अन्य मशीन से में SSH और gdb (untested)

संपादित से ScreenSaverEngine लांच कर सकता है:

भी, आप एक नया आवेदन लक्ष्य जोड़ने का प्रयास करें और जोड़ सकते हैं आईबी में एक विंडो में आपका स्क्रीनसेवर व्यू, आपको सेटिंग्स की तरह मैन्युअल रूप से कॉन्फ़िगर करना पड़ सकता है, लेकिन यह कुछ लोगों की मदद कर सकता है और संभवतः ठीक काम करना चाहिए क्योंकि स्क्रीनसेवर व्यू NSView

+0

मैं केवल एक और मशीन की उपलब्धता की कमी के कारण इसे टालने की कोशिश कर रहा था ... –

6

लोड करने वाले एप्लिकेशन को निष्पादित करके प्लगइन डीबग कर सकता है प्लग में।

तो स्क्रीनसेवर डीबग करने के लिए, अपनी प्लगइन प्रोजेक्ट खोलें, प्रोजेक्ट मेनू से नया कस्टम एक्जिक्यूटिव चुनें और एप्लिकेशन को स्क्रीनसेवर इंजन के रूप में सेट करें।

स्क्रीनसेवर डीबग करने के लिए, आप एक दूसरे मैक का उपयोग करना चाहेंगे और remote debugging का उपयोग कर सकते हैं ताकि आपके उपयोगकर्ता इंटरफ़ेस क्रियाएं स्क्रीनसेवर में हस्तक्षेप न करें।

+0

एक्सकोड 4 के साथ शेर पर, मैंने पाया कि यह योजना के निष्पादन योग्य/सिस्टम/फ्रेमवर्क /स्क्रीनसेवर.फ्रेमवर्क/संसाधन/ScreenSaverEngine.app – iforce2d

+0

मैंने यह भी पाया कि आपको हर बार जब भी आप इसे बदलते हैं, तो सिस्टम प्राथमिकताओं में स्क्रीनसेवर को सामान्य रूप से स्थापित करने की आवश्यकता होती है, लेकिन यह हर बार 3 मिनट प्रतीक्षा करने से बेहतर है। – iforce2d

+0

>>> यहां टेक्स्ट को प्रारूपित नहीं कर सकता; नए उत्तर पर जाएं <<< – geowar

2

जैसा कि पीटर कहता है, आप प्लगइन को लोड करने वाले एप्लिकेशन को निष्पादित करके प्लगइन डीबग कर सकते हैं।

हालांकि, स्क्रीनसेवर इंजन का उपयोग करने के बजाय आप सिस्टम वरीयताओं का भी उपयोग कर सकते हैं। जब आपकी प्लगइन लोड करने के लिए प्राथमिकताएं "डेस्कटॉप & स्क्रीन सेवर" के अंतर्गत आपके स्क्रीनसेवर पर नेविगेट दिखाई देती हैं।

यह सही नहीं है क्योंकि आपका दृश्य पूर्ण आकार नहीं होगा, लेकिन यह रिमोट डीबगिंग सेट करने से आसान हो सकता है।

+0

मैं इस विधि का उपयोग कर रहा हूं। मेरे उद्देश्यों के लिए बहुत अच्छा काम करता है। –

+0

मैं यही उपयोग करता हूं (मैं कुछ डेटा गहन कोर कोड प्राप्त करने के लिए स्टैंडअलोन टेस्ट ऐप्स से फ़ाइलों में लॉगिंग का भी उपयोग करता हूं)। मैक ओएस एक्स और एक्सकोड (उदा।, 10.10 और एक्ससी 7) के हाल के संस्करणों पर, ध्यान दें कि आप बस अपने ब्रेकपॉइंट्स को सक्षम करते हैं, सिस्टम प्राथमिकताएं (एक्ससी डीबग मेनू) पर "संलग्न करें", सूची में अपने स्क्रीनसेवर पर क्लिक करें, और वॉयला , आप अपने स्रोत से कदम उठा सकते हैं (मान लीजिए कि आपने डीबग बिल्ड स्थापित किया है)। आप अपने स्क्रीन सेवर के बड़े उदाहरण डीबग करने के लिए पूर्वावलोकन सुविधा का आसानी से उपयोग नहीं कर सकते हैं, बशर्ते कि यह पूरी स्क्रीन को कवर करे। – jarFlooby

2

कुछ मैक ओएस एक्स ऐप्स हैं जो स्क्रीन सेवर चलाएंगे: सेवरलैब, स्क्रीनलाइश, इत्यादि बस उनमें से एक को वेब पर ढूंढें और इसे डाउनलोड करें और फिर इसे लक्ष्य निष्पादन योग्य के रूप में सेट करें (जैसे पीटर एन लुईस ने कहा) ।

प्रत्येक निर्माण के बाद बिल्ड उत्पाद को '~/लाइब्रेरी/स्क्रीन सेवर /' पर कॉपी करने से बचने के लिए आप एक कस्टम बिल्ड स्क्रिप्ट जोड़ सकते हैं (नोट: मैं खोल के लिए '/ bin/tcsh -x' का उपयोग कर रहा हूं):

#remove the old screen saver or link 
rm -Rf "${SCRIPT_OUTPUT_FILE_0}" 

#if this is a debug build… 
if ("${CONFIGURATION}" == "Debug") then 

# create a symbolic link from our screen saver to this users screen saver directory 
ln -sfv "${SCRIPT_INPUT_FILE_0}" "${SCRIPT_OUTPUT_FILE_0}" 

#if this is a release build… 
else if ("${CONFIGURATION}" == "Release") then 

# copy our screen saver to this users CMM directory 
cp -Rfv "${SCRIPT_INPUT_FILE_0}" "${SCRIPT_OUTPUT_FILE_0}" 

endif 

फिर अपने इनपुट फ़ाइल स्थापित करने के लिए "$ {BUILT_PRODUCTS_DIR}/$ {FULL_PRODUCT_NAME}" और उसके आउटपुट फ़ाइल "$ {गृह}/पुस्तकालय/स्क्रीन सेवर्स/$ {FULL_PRODUCT_NAME}" करने के लिए।

अब जब आप अपनी प्रोजेक्ट बनाते/चलाते हैं तो यह आपके डीबग बिल्ड से ऑटो-जादू से लिंक होगा या आपके रिलीज बिल्ड की प्रतिलिपि बनायेगा।

3

आप स्क्रीनसेवर इंजन ('/ सिस्टम/लाइब्रेरी/फ्रेमवर्कवर्क /स्क्रीनसेवर.फ्रेमवर्क/रीसेट्स /स्क्रीनसेवरइंजिन.एप') को निष्पादन योग्य लक्ष्य भी बना सकते हैं और इसे बैकग्राउंड ध्वज पास कर सकते हैं (इसलिए यह इसके बजाय सबकुछ के पीछे चलता है सब कुछ के सामने)।

+2

दुर्भाग्यवश, यह 10.11 एल कैपिटन पर काम नहीं करता है क्योंकि सिस्टम इंटीग्रटी प्रोटेक्शन डीबगर के भीतर स्क्रीनसेवरइंजिन चलाने से रोकता है। –

+1

यह मेरे लिए यहां काम कर रहा है ... शायद क्योंकि मैंने एसआईपी को अक्षम कर दिया है? – geowar

+2

ठीक है, एसआईपी को अक्षम करने से आप स्क्रीनसेवरइंजिन जैसे सिस्टम ऐप्स डीबग कर सकते हैं। मैंने एक वर्कअराउंड का पता लगाया, हालांकि:/System फ़ोल्डर पदानुक्रम से इसे कॉपी करके ScreenSaverEngine.app का डुप्लिकेट बनाएं, और उसके बाद उस डुप्लिकेट को लक्ष्य निष्पादन योग्य के रूप में सेट करें। ऐप की डुप्लिकेट प्रति अब एसआईपी के अधीन नहीं है, इसलिए इसे एक्सकोड द्वारा डीबग किया जा सकता है। –

4

ओएस एक्स 10.11 एल कैपिटन की सिस्टम इंटीग्रटी प्रोटेक्शन फीचर के कारण, डीबगर /System/ से चल रहे किसी भी चीज़ से संलग्न नहीं हो सकता है। साथ ही, अन्य जानकारी यहां एक्सकोड के पुराने संस्करणों पर लागू होती है।

  1. कॉपी /System/Library/Frameworks/ScreenSaver.framework/Versions/A/Resources/ScreenSaverEngine.app//tmp/ रहे हैं: मैं इसे कैसे Xcode 7.2 के साथ एल कैप्टन पर काम कर मिल गया

    यहाँ है। (.xcscheme पूरी तरह से योग्य पथ का संदर्भ के बाद से, किसी ऐसे स्थान पर आम उसकी प्रतिलिपि बनाना, बजाय एक विशेष उपयोगकर्ता की होम निर्देशिका में कहीं के सहयोग के लिए सबसे अच्छा है।)

  2. संपादित परियोजना की .xcscheme:
    • निष्पादन सेट इसकी प्रतिलिपि बनाई गई ऐप पर कार्रवाई करें, और तर्क जोड़ें: -debug-background-module "<product-name>" (जहां <product-name>.saver एक्सटेंशन के बिना बंडल नाम है)।
    • एक प्री-एक्शन स्क्रिप्ट (नीचे स्रोत) जोड़ें, इसके खोल को /bin/bash पर सेट करें और इसकी बिल्ड सेटिंग्स योजना से आने के लिए। यह में बनाया .saver बंडल के लिए एक प्रतीकात्मक लिंक बनाता है ~/Library/Screen Savers/

स्रोत:

SCREEN_SAVER_PATH="${HOME}/Library/Screen Savers/${FULL_PRODUCT_NAME}" 
if [[ -d "${SCREEN_SAVER_PATH}" || -f "${SCREEN_SAVER_PATH}" || -L "${SCREEN_SAVER_PATH}" ]]; then 
    rm -Rf "${SCREEN_SAVER_PATH}" 
fi 
ln -s "${BUILT_PRODUCTS_DIR}/${FULL_PRODUCT_NAME}" "${SCREEN_SAVER_PATH}" 

अब, जब आप Xcode रन बटन हिट, स्क्रीन सेवर वॉलपेपर मोड में अपने डेस्कटॉप पर चलेगा , और आप डीबगर का उपयोग कर सकते हैं।

0

यदि आप ScreenSaverEngine ऐप की एक प्रति बनाते हैं, और इसे अपने डेवलपर आईडी से साइन करते हैं, तो यह उस स्थिति को ठीक करेगा जहां सिस्टम इंटीग्रटी प्रोटेक्शन डीबगर को जोड़ने से रोकता है। बस निष्पादन योग्य को अपनी स्वयं की हस्ताक्षरित प्रतिलिपि पर सेट करना सुनिश्चित करें।