2012-10-10 15 views
54

मैं जानता हूँ कि जब मैं एक ब्रेकपाइंट या po [self someIvarHoldingAnObject] सेट मैं print someFloatVariable टाइप कर सकते हैं, लेकिन मैं की तरह उपयोगी बातें नहीं कर सकते हैं:एलएलडीबी डीबगर में विधियों को कॉल करने या कोड निष्पादित करने के लिए कैसे?

[self setAlpha:1]; 

तो यह बाहर थूक:

error: '[self' is not a valid command.

अजीब बात यह है कि मैं po [self someIvarHoldingAnObject] पर कॉल कर सकते हैं और यह इसका विवरण प्रिंट करेगा।

मेरा मानना ​​है कि मैंने एक साल पहले एक वीडियो देखा है जहां किसी ने दिखाया कि रनटाइम पर कंसोल के माध्यम से कोड कैसे निष्पादित किया जाए, और यदि मुझे गलत नहीं लगता है तो इस लड़के ने पॉइंटर्स को तर्क और असाइन ऑब्जेक्ट भी प्रदान किए हैं। उसको कैसे करे?

+0

एक उदाहरण है [lldb-for-gdb-users.txt] में (http://opensource.apple.com/source/lldb/lldb-69/docs/lldb-for-gdb-users।txt) सी के लिए: 'expr (int) printf (" ... ")'। हो सकता है कि आपको 'expr (type)' के साथ अपना विधि आमंत्रण उपसर्ग करना चाहिए? – osgx

उत्तर

85

gdb v। Lldb आदेश के लिए विहित संदर्भ http://lldb.llvm.org/lldb-gdb.html

आप expr आदेश जो एक अभिव्यक्ति का मूल्यांकन करता है का उपयोग करना चाहते है। यह lldb आदेशों में से एक है जो तर्कों के अतिरिक्त "कच्चा इनपुट" लेता है, इसलिए आपको अक्सर यह संकेत देने के लिए "-" की आवश्यकता होती है कि तर्क (expr) समाप्त होता है और कमांड शुरू होता है। जैसे

(lldb) expr -- [self setAlpha:1] 

वहाँ एक शॉर्टकट, "पी" है, जो करता है - आप के लिए (लेकिन किसी भी तर्क की अनुमति नहीं है), उदा

(lldb) p [self setAlpha:1] 

समारोह (रों) आप कॉल कर रहे अपने कार्यक्रम का हिस्सा नहीं हैं, तो आप अक्सर ऐसा lldb जानता है कि कैसे उन्हें फोन करने के लिए स्पष्ट रूप से उनकी वापसी प्रकार की घोषणा करने की आवश्यकता होगी। जैसे

(lldb) p printf("hi\n") 
error: 'printf' has unknown return type; cast the call to its declared return type 
error: 1 errors parsing expression 
(lldb) p (int)printf("hi\n") 
(int) $0 = 3 
hi 
(lldb) 

फ़्लोटिंग पॉइंट तर्क समस्या, बीटीडब्ल्यू के आसपास काम करने का एक साफ तरीका है। आप एक "अभिव्यक्ति उपसर्ग" फ़ाइल बनाते हैं जो आपके वर्ग विधियों के प्रोटोटाइप के साथ lldb में दर्ज प्रत्येक अभिव्यक्ति में जोड़ा जाता है। उदाहरण के लिए, मेरे पास एक क्लास माई क्लास है जो एनएसओब्जेक्ट से प्राप्त होता है, इसमें रुचि के दो तरीके होते हैं, "setArg:" और "getArg" जो सेट करते हैं और एक फ्लोट ivar प्राप्त करते हैं। यह एक मूर्खतापूर्ण छोटा उदाहरण है, लेकिन यह दिखाता है कि इसका उपयोग कैसे करें।

@interface NSObject 
@end 
@interface MyClass : NSObject 
- init; 
- setArg: (float)arg; 
- (float) getArg; 
@end 

extern "C" { 
    int strcmp (const char *, const char *); 
    int printf(const char * __restrict, ...); 
    void puts (const char *); 
} 

मेरी ~/.lldbinit फ़ाइल में मैं

settings set target.expr-prefix /Users/jason/lldb-prefix.h 

जोड़ सकते हैं और अब मैं

(lldb) p [var getArg] 
(float) $0 = 0.5 
(lldb) p [var setArg:0.7] 
(id) $1 = 0x0000000100104740 
(lldb) p [var getArg] 
(float) $2 = 0.7 

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

(lldb) p printf("HI\n") 
<no result> 
HI 
(lldb) p strcmp ("HI", "THERE") 
(int) $3 = -12 

(। कि "< कोई परिणाम >" बात पहले से ही lldb TOT स्रोतों के लिए प्रतिबद्ध किया गया है के लिए एक ठीक)

+0

expr - [self setAlpha: 0.5f] या expr - [self setAlpha: 1] दोनों प्रश्न में दृश्य को पूरी तरह से स्क्रीन से गायब कर देते हैं। ऐसा लगता है कि कुछ हो रहा है, लेकिन निश्चित रूप से सही बात नहीं है। जब मैं ब्रेकपॉइंट सेट करता हूं तो मैं केवल इन आदेशों को टाइप कर सकता हूं। या क्या इस तरह की चीजें करने का कोई तरीका है जबकि कोड अभी भी चल रहा है/रोका गया है? –

+0

नहीं, जब आप इस विधि को कॉल करते हैं तो आपको रोकने की प्रक्रिया की आवश्यकता होती है। यदि यह चयनकर्ता एक फ्लोट प्रकार लेता है, तो एक कमी है जो आप एक्सकोड 4.5 के एलएलडीबी के साथ मार रहे हैं - यदि फ़ंक्शन तर्क एक फ्लोट प्रकार लेता है और आपके पास डीबग जानकारी नहीं है, तो lldb आपको कोई रास्ता नहीं देता है एक फ्लोट के रूप में मूल्य पास करें। पुरानी सी भाषा नो-प्रोटोटाइप तर्क पदोन्नति नियमों के बाद, यह बिना शर्त के रूप में इसे पारित कर देगा। यदि एलएलडीबी ने इस वर्ग के लिए जानकारी डीबग की है, तो यह सही काम करने में सक्षम होना चाहिए। ओबीजेसी प्रोग्रामिंग में इस समस्या के कई उदाहरण भविष्य में रिलीज में तय किए जाएंगे। –

+0

एनबी: यदि आप समस्या को मार रहे हैं तो मेरा मतलब फ्लोट वी। डबल के साथ है, जो मूल्य आप अपने सेट में गुजर रहे हैं, वह एल्फा नहीं होगा जो आप उम्मीद करते हैं, यह कुछ यादृच्छिक दिखने वाला पागल नंबर होगा जो 0 के बहुत करीब हो सकता है, उदाहरण के लिए। –

2

आप बहु की जरूरत है, expression का उपयोग करें:

expression 

do { 
    try thing.save() 
} catch { 
    print(error) 
} 

// code will execute now 

रिक्त कोड को खत्म करने और निष्पादित करने के लिए लाइन।

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

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