Xcode में LLDB के साथ डीबग करते समय चर मान कैसे बदलें?


173

Xcode में, GDB आपको डिबगिंग करते समय स्थानीय चर बदलने की अनुमति देता है (देखें XCode में डीबगिंग करते समय NSString मान कैसे बदलें? )। क्या एलएलडीबी एक समान कार्यक्षमता प्रदान करता है? यदि हां, तो हम इसका उपयोग कैसे कर सकते हैं?


IOS में उन्नत डिबगिंग देखना सुनिश्चित करें । यह कमाल है
हनी

मैं एक ऑब्जेक्ट प्रॉपर्टी सेट करने का प्रयास कर रहा हूं, जो काम करता है अगर स्ट्रिंग की लंबाई 0-15 वर्णों के बीच हो। 16 या अधिक वर्णों की एक स्ट्रिंग सेट करना स्वीकार किया जाता है, लेकिन जब मैं इसे वापस प्रिंट करता हूं, तो यह मुझे एक बकवास स्ट्रिंग दिखाता है: po myObj.someString = "1234567890123456", जो काम करता है, लेकिन जब मैं प्रिंट प्राप्त करता हूं (स्ट्रिंग? $ R68 = "?" \ 0 \ 0 \ 0 \ 0 @ \ _ a \ u {1} \ c {5} \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ "
निक राइट

जवाबों:


267
expr myString = @"Foo"

(lldb)
मौजूदा प्रोग्राम के संदर्भ में C / ObjC / C ++ एक्सप्रेशन का मूल्यांकन करने में मदद करें , वर्तमान में दायरे में चर का उपयोग कर। यह कमांड 'रॉ' इनपुट लेता है (सामान को कोट करने की आवश्यकता नहीं है)।

सिंटेक्स: अभिव्यक्ति -

कमांड विकल्प उपयोग: अभिव्यक्ति [-f] [-जी] [-ड] [-यू] - अभिव्यक्ति [-ओ] [-d] [-यू] - अभिव्यक्ति

   -G <gdb-format>  ( --gdb-format <gdb-format> )
        Specify a format using a GDB format specifier string.

   -d <boolean>  ( --dynamic-value <boolean> )
        Upcast the value resulting from the expression to its dynamic type
        if available.

   -f <format>  ( --format <format> )
        Specify a format to be used for display.

   -o  ( --object-description )
        Print the object description of the value resulting from the
        expression.

   -u <boolean>  ( --unwind-on-error <boolean> )
        Clean up program state if the expression causes a crash, breakpoint
        hit or signal.

उदाहरण:

expr my_struct-> a = my_array [3]
expr -f bin - (इंडेक्स * 8) + 5
expr char c [] = "foo"; ग [0]

महत्वपूर्ण नोट: क्योंकि यह कमांड 'कच्चा' इनपुट लेता है, यदि आप कमांड विकल्पों के अंत और कच्चे इनपुट की शुरुआत के बीच किसी भी कमांड विकल्प का उपयोग करते हैं, जिसका आपको उपयोग करना चाहिए।

'एक्सप्र' 'अभिव्यक्ति' का संक्षिप्त नाम है


1
वास्तव में, धन्यवाद! एक और छोटा सा सवाल: मैं यह करने के लिए एक UILabel के पाठ को बदलने की कोशिश कर रहा हूँ: 'expr myLabel.text = @"hello!"लेकिन मुझे एक error: property 'text' not found on object of type 'UILabel *'... कोई विचार?
एरिक

10
expr (void)[label setText:@"Foo"]करना चाहिए। डॉट-सिंटैक्स आमतौर पर डिबगर में काम नहीं करेगा। lldb संभवतः इसकी व्याख्या करता है जैसा कि आप एक c-स्ट्रक्चर के सदस्य तक पहुंचना चाहते थे, लेकिन मुझे यकीन नहीं है कि यह कारण है कि यह काम नहीं करेगा। डॉट-सिंटैक्स poया तो काम नहीं करता है । इसके बजाय po label.textआपको उपयोग करना होगाpo [label text]
मथायस बाउच

4
दरअसल, ldb डॉट सिंटैक्स को gdb से बहुत बेहतर तरीके से हैंडल करता है। जीडीबी सिर्फ यह मानता है कि आप इसे सी-स्ट्रक्चर की तरह मान रहे हैं, जो विफल हो जाता है। lldb संपत्तियों को सही ढंग से एक्सेस करेगा, लेकिन केवल तभी जब वे वास्तव में घोषित किए जाते हैं @property
बीजे होमर

28
आप pशॉर्टकट के रूप में भी उपयोग कर सकते हैं expr। उदाहरण:(lldb) p url = @"http://google.com"
फफूंद

11
आप eशॉर्टकट के रूप में भी उपयोग कर सकते हैं expr। BTW, pप्रिंट के लिए एक उपनाम है जो expr --(बस कच्चे इनपुट, कोई झंडे नहीं) के लिए एक उपनाम है expr -o -- [object]या poआम तौर पर यद्यपि आप वस्तुओं के लिए अधिक उपयोगी आउटपुट देते हैं।
जेसन न्यूवेल

21

निम्नलिखित सामान मेरे लिए काम करता है। मैं Xcode 8 का उपयोग कर रहा हूं।

यदि आप कुछ चर सेट करना चाहते हैं (उदाहरण के लिए "तानाशाही") शून्य करने के लिए और फिर कोड प्रवाह का परीक्षण करें, तो आप निम्नलिखित प्रयास कर सकते हैं।

  1. वांछित मान पर आरंभीकृत होने के बाद ब्रेकपॉइंट ठीक से लगाएं।
  2. फिर इसे बदलने के लिए lldb कमांड लाइन में "एक्सप्रेशन डिक्टेड = नील" निष्पादित करें। (उदाहरण के लिए "नील")
  3. ब्रेक प्वाइंट पर कदम।
  4. अगली पंक्ति में चर "तानाशाही" की जाँच करें। यह शून्य होगा।

यह कंसोल में कुछ इस तरह दिखेगा।

(lldb) expression dict = nil
(NSDictionary *) $5 = nil

3

यदि आप आवश्यक चर के आरंभ के बाद Xcode 10 या 11 का उपयोग कर रहे हैं, तो विराम बिंदु को ठीक से रखें तो आप po myString = "Hello World"आसानी से उपयोग करके अपने चर को बदल सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.