2015-01-23 10 views
10

उद्देश्य-सी में, मैं कभी-कभी एलएलडीबी में वॉचपॉइंट्स सेट करता हूं ताकि मुझे पता चल सके कि आवृत्ति चर बदल गया था। क्या मैं इसे स्विफ्ट गुणों के साथ भी कर सकता हूं?क्या स्विफ्ट गुणों पर वॉचपॉइंट सेट करना संभव है?

अभी, एक ही रास्ता मैं इस लक्ष्य को हासिल कर सकते हैं:

  • संपत्ति के लिए एक didSet हैंडलर जोड़ने और अंदर एक ब्रेकपाइंट की स्थापना (लेकिन इस कार्यक्रम और कंपाइल है, जो एक तरह से उद्देश्य धरा को रोकने की आवश्यकता है)
  • [setPropertyName:] पर एक प्रतीकात्मक ब्रेकप्वाइंट लेकिन यह केवल काम करता है वर्ग ऑब्जेक्टिव-सी ब्रिजिंग

मैं किसी अन्य विकल्प हैं समर्थन करने के लिए होता है अगर जोड़ने?

उत्तर

14

उत्तर मैंने कल्पना की तुलना में बहुत आसान था। ऐसा करने का सबसे आसान तरीका केवल संपत्ति घोषणा पर ब्रेकपॉइंट जोड़ना है। जब भी संपत्ति या तो पढ़ी जाती है या लिखा जाता है तो डीबगर टूट जाएगा।

यदि मेरे जैसे, आप केवल तभी तोड़ना चाहते हैं जब संपत्ति बदल जाती है और fetches को अनदेखा कर देती है, संपत्ति घोषणा पर ब्रेकपॉइंट सेट करें, फिर एलएलडीबी कंसोल में जाएं और अपनी सभी सूची देखने के लिए "br list" टाइप करें ब्रेकपॉइंट्स:

(lldb) br list 
Current breakpoints: 
1: file = '/Users/testuser/Desktop/TestFoo/Test.swift', line = 12, locations = 3, resolved = 3, hit count = 1 

    1.1: where = TestFoo`TestFoo.Test.x.getter : Swift.Int + 12 at Test.swift:12, address = 0x00000001084cfefc, resolved, hit count = 1 
    1.2: where = TestFoo`TestFoo.Test.x.setter : Swift.Int + 16 at Test.swift:12, address = 0x00000001084cff80, resolved, hit count = 0 
    1.3: where = TestFoo`TestFoo.Test.x.materializeForSet : Swift.Int + 16 at Test.swift:12, address = 0x00000001084d00f0, resolved, hit count = 0 

जैसा कि आप देख सकते हैं, तीन उप-ब्रेकपॉइंट्स के साथ एक मास्टर ब्रेकपॉइंट "1" है। गेटटर के लिए उप-ब्रेकपॉइंट अक्षम करें:

(lldb) br disable 1.1 
1 breakpoints disabled. 

और आप सभी सेट हैं। डीबगर केवल तभी टूट जाएगा जब उस संपत्ति को संशोधित किया जाएगा।

1

एक्सकोड (8.2 स्विफ्ट 3.0) पर सामान्य रूप से तेजी से संपत्ति पर ब्रेकपॉइंट सेट करें और फिर अपना ऐप चलाएं। बाद एप्लिकेशन ब्रेकप्वाइंट पैनल पर जाएँ भाग गया है आप एक से अधिक breakpoints में ब्रेकप्वाइंट का विस्तार कर सकते हैं:

enter image description here

सभी डिफ़ॉल्ट रूप से चयन किया जाता है, तो आप लोगों को आप की जरूरत नहीं है निष्क्रिय कर सकते हैं। नोट: मैंने पाया कि जब आप पहली बार ब्रेकपॉइंट जोड़ते हैं तो यह तब तक विस्तारित नहीं होगा जब तक आप ऐप नहीं चलाते।

एक वैकल्पिक विधि जिसे आप कोशिश कर सकते हैं, उन्हें जोड़ने के लिए lldb का उपयोग करना है। सबसे पहले अपने क्लास इंस्टेंस के अंदर ब्रेकपॉइंट जोड़ें जैसे व्यूडिडलोड एक्सटी। पी स्वयं और अपने उदाहरण के स्मृति पते नोट करें।

फिर ब्रेकपॉइंट जोड़ें जैसे 0x0f0f0f0f0f0f आपकी कक्षा का स्मृति पता है।

break set -F '-[MyClass setMyProperty:]' -c '$rdi == 0x0f0f0f0f0f0f’ 
संबंधित मुद्दे