ऑब्जेक्ट स्ट्रिंग प्रॉपर्टी के आधार पर Xcode में सशर्त विराम बिंदु कैसे सेट करें?


90

मैं डिबगर को तोड़ने में सक्षम होना चाहता हूं जब यह किसी विशेष स्ट्रिंग मैच तक पहुंचता है। एक उदाहरण के रूप में, मेरे पास कुछ इस तरह हो सकता है:

Foo myObj = [self gimmeObj];

myObjनामक एक संपत्ति हो सकती है name। मैं चाहता हूं कि डिबगर कब असाइनमेंट पर बंद हो जाए

[myObj.name isEqualToString:@"Bar"];

मैं अपना सशर्त विराम बिंदु Xcode में कैसे सेट कर सकता हूं?

जवाबों:


184

आप सामान्य रूप से ब्रेकपॉइंट सेट करके Xcode में एक सशर्त विराम बिंदु सेट कर सकते हैं, फिर उस पर नियंत्रण-क्लिक करें और संपादन ब्रेकपॉइंट चुनें (रन -> शो -> ब्रेकपॉइंट चुनें)।

ब्रेकपॉइंट प्रविष्टि में, एक शर्त स्तंभ है।

अब, हालत को ध्यान में रखने के लिए कई मुद्दे हैं। सबसे पहले, जीडीबी डॉट सिंटैक्स को नहीं समझता है, इसलिए myObj.name के बजाय, आपको [myObj नाम] (जब तक नाम एक ivar नहीं है) का उपयोग करना होगा।

अगला, जैसा कि gdb में अधिकांश भावों के साथ होता है, आपको इसे "BOOL" नाम का रिटर्न परिणाम बताना होगा। तो एक शर्त सेट करें:

(BOOL)[[myObj name] isEqualToString:@"Bar"]

अक्सर यह वास्तव में कोड को अस्थायी रूप से जोड़कर ऐसा करना आसान होता है:

if ( [myObj.name isEqualToString:@"Bar"] ) {
    NSLog( @"here" );
}

और फिर NSLog पर ब्रेक पॉइंट सेट करें। फिर आपकी स्थिति मनमाने ढंग से जटिल हो सकती है बिना इस बात की चिंता किए कि gdb क्या कर सकता है और पार्स नहीं कर सकता।


11
सिवाय इसके कि आपके कोड को बदलकर आप अपने लॉगिंग या व्यवहार को हटाने के लिए भूलने के जोखिम को चलाते हैं
Pål Brattberg

3
यह सच है। मैं अक्सर स्ट्रिंग में "NYI" (अभी तक लागू नहीं) को जोड़कर इसे कम करता हूं, और फिर NYI के लिए मेरी पूर्व-रिलीज़ चेक खोज इसे पकड़ लेगी।
पीटर एन लुईस

17
इस काम को करने के लिए मुझे (बूल) को (BOOL) के रूप में (एलओएलबी), शायद एक एलएलडीबी चीज बनाना था।
वेक्स

1
BDB ने मेरे लिए GDB में काम नहीं किया, मुझे BOOL का उपयोग करना पड़ा या अंतर- अंतर यहां बताया गया है stackoverflow.com/a/544250/725871
चॉस्फीयर 2112

2
यदि आप एक बार हर 200 खेल बग जो अंत में आ गया है, तो आप इसे कोड में नहीं डाल सकते हैं, और अब आपको एक शर्त ब्रेकआउट करने की आवश्यकता है। कोड को बदलने के लिए प्रोग्राम को रोकना एक विकल्प नहीं है।
अलमो

17

यहाँ आप XCode lldb सशर्त विराम बिंदु का उपयोग कैसे करते हैं।

सबसे पहले, ब्रेक पॉइंट (या राइट क्लिक edit breakpoint) पर डबल क्लिक करें , आप एक डायलॉग पॉपअप देख सकते हैं।

यहां छवि विवरण दर्ज करें

यहाँ उन विकल्पों का मतलब है:

  1. शर्त : इस स्थिति के तहत ब्रेकपॉइंट केवल आग देगा।
  2. ध्यान न दें : ब्रेकपॉइंट को फायर करने से पहले स्थिति को जितनी बार पूरा करने की आवश्यकता होती है
  3. क्रिया : ब्रेकपॉइंट के टूटने के बाद चलने वाली क्रिया।
  4. विकल्प : कार्यों का मूल्यांकन करने के बाद स्वचालित रूप से जारी रखें

यहाँ एक सारांश है। छवि में उपरोक्त उदाहरण के लिए, इसका मतलब है कि जब चर buildingId13 के बराबर है, तो यहां तोड़ दें। अगर मैं अनदेखा समय 1 में जोड़ता हूं, तो यह पहली बार अनदेखी करेगा जब buildingId13 के बराबर होगा और दूसरी बार स्थिति पूरी होने पर टूट जाएगा।

कार्यों के लिए, जब आप ऐड एक्शन दबाते हैं, तो पसंद की एक सूची होगी। आमतौर पर मैं जो कुछ भी करता हूं उसका उपयोग उन Debugger Command poचरों को प्रिंट करने के लिए किया जाता है जिनकी मुझे जांच करने की आवश्यकता होती है और मेरा मानना ​​है कि क्रियाओं का उपयोग करने के बेहतर तरीके हैं।

ऐसा लगता है कि यदि आपको रनटाइम पर स्थितियां बदलनी हैं तो आपको ऐप को फिर से चलाना और चलाना होगा


शायद क्योंकि यह सवाल एक स्ट्रिंग वैल्यू के आधार पर ब्रेकप्वाइंट पर रुकने के बारे में था [मैं डाउन-वोटर नहीं था]
ZS

1
धन्यवाद, काफी मददगार। यह उत्तर अधिक मतों का हकदार है।
andreskwan

7

मुझे यकीन नहीं है कि यह काम करेगा, लेकिन आप कोड की उस लाइन पर एक ब्रेकपॉइंट सेट करने की कोशिश कर सकते हैं, डिबगर कंसोल (Cmd + Shift + R) खोलें, और टाइप करें

condition N (int)[[myObj name] isEqualToString:@"Bar"]

जहां N को ब्रेकपॉइंट (एक पूर्णांक) की संख्या से बदल दिया जाता है।


2

यदि आप सेटर का उपयोग करके myObj.name म्यूट करते हैं, तो आप -[MyObjClass setName:]डीबगर कंसोल से या रन से> प्रतीकात्मक ब्रेकप्वाइंट-> सिम्बोलिक ब्रेकपॉइंट मेनू को Xcode में जोड़कर एक प्रतीकात्मक ब्रेकप्वाइंट जोड़ सकते हैं । यदि नहीं (क्यों नहीं? आप शायद उदाहरण के वेरिएबल को सीधे निर्दिष्ट इनिशियलाइज़र या डीललॉक को छोड़कर संशोधित नहीं कर रहे हैं) तो आप gdb में एक नजरिया सेट कर सकते हैं (डिबगर के चलने के बाद Xcode में डीबगर कंसोल का उपयोग करें)। यह पृष्ठ बताता है कि कैसे। मेरा मानना ​​है कि एक्सकोड डिबगर कंसोल का उपयोग किए बिना वॉचपॉइंट्स सेट करने के लिए एक यूआई को उजागर करता है।


0

ऐसे समय में जब चौखटे (डिबग बिल्ड) के साथ काम कर रहे हों और कुछ फाइल / लोकेशन में एक ब्रेकपॉइंट लगाने की आवश्यकता होती है, जो विकास के तहत फ्रेमवर्क में युवावस्था में नेविगेट करने में मुश्किल हो या उजागर न हो। एक विकल्प सशर्त ब्रेकपॉइंट को ट्रिगर करने और स्टेप-इन / स्टेप-आउट आसान बनाने के लिए एक सहायक वर्ग लिखना है।

- (void)invokeFrameworkMethod {
    ...
    [DebugConditionalBreakPointHelper breakPointCondition:YES comment:@"from invokeFrameworkMethod."];
    ...
}

विकास के तहत ढांचे में हैडर की घोषणा।

#import <Foundation/Foundation.h>

@interface DebugConditionalBreakPointHelper : NSObject
+ (void)breakPointCondition:(BOOL)enabled comment:(NSString *)comment;
@end

और कार्यान्वयन फ़ाइल:

#import "DebugConditionalBreakPointHelper.h"

@implementation DebugConditionalBreakPointHelper
+ (void)breakPointCondition:(BOOL)enabled comment:(NSString *)comment {
    if (enabled)
    {
        NSLog(@"Triggerred Conditional Break Point. Comment: %@");
    }
}
@end
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.