কোনও বস্তুর স্ট্রিংয়ের উপর ভিত্তি করে এক্সকোডে শর্তযুক্ত ব্রেকপয়েন্টটি কীভাবে সেট করবেন?


93

আমি যখন কোনও নির্দিষ্ট স্ট্রিং ম্যাচে পৌঁছায় তখন ডিবাগার ব্রেকটি করতে সক্ষম হতে দেখছি। উদাহরণ হিসাবে, আমার এর মতো কিছু থাকতে পারে:

Foo myObj = [self gimmeObj];

myObjএকটি সম্পত্তি বলা হতে পারে name। আমি চাই যখন ডিবাগারটি অ্যাসাইনমেন্টটি বন্ধ করে দেয়

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

এটি করতে আমি কীভাবে এক্সকোডে আমার শর্তাধীন ব্রেকপয়েন্টটি সেট করতে পারি?

উত্তর:


185

আপনি সাধারণভাবে ব্রেকপয়েন্টটি সেট করে এক্সকোডে একটি শর্তযুক্ত ব্রেক পয়েন্ট সেট করতে পারেন, তারপরে এটিতে কন্ট্রোল-ক্লিক করুন এবং ব্রেকপয়েন্টটি সম্পাদনা করুন (রান -> শো -> ব্রেকপয়েন্টগুলি নির্বাচন করুন) নির্বাচন করুন।

ব্রেকপয়েন্ট এন্ট্রিতে একটি কন্ডিশন কলাম রয়েছে।

এখন, শর্তটি মনে রাখার জন্য বেশ কয়েকটি বিষয় রয়েছে। প্রথমত, gdb ডট বাক্য গঠন বুঝতে পারে না, সুতরাং myObj.name এর পরিবর্তে আপনাকে অবশ্যই [মাইওবজ নাম] ব্যবহার করতে হবে (নামটি আইভার না থাকলে)।

এর পরে, জিডিবি-র বেশিরভাগ এক্সপ্রেশন হিসাবে, আপনাকে অবশ্যই এটির ফলাফলের ধরণটি বলতে হবে, নাম "বিওএল"। সুতরাং একটি শর্ত সেট করুন:

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

অস্থায়ীভাবে এই জাতীয় কোড যুক্ত করে কোডে সাধারণত এটি করা সহজ হয়:

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

এবং তারপরে এনএসএলগে ব্রেক পয়েন্ট সেট করে। তারপরে জিডিবি কী পার্স করতে পারে এবং পার্স করতে পারে তা নিয়ে চিন্তা না করে আপনার অবস্থা নির্বিচারে জটিল হতে পারে।


12
আপনার কোড পরিবর্তন করে আপনি আপনার লগিং বা পরিবর্তন করার আচরণটি ভুলে যাওয়ার ঝুঁকিটি চালান
পল ব্রাটবার্গ ২

4
সেটা সত্য. আমি প্রায়শই স্ট্রিংটিতে "এনওয়াইআই" (এখনও বাস্তবায়িত নয়) যুক্ত করে এটিকে প্রশমিত করি এবং তারপরে এনওয়াইআইয়ের জন্য আমার প্রাক-প্রকাশের চেক অনুসন্ধান এটি ধরবে।
পিটার এন লুইস

18
এই কাজটি পেতে আমাকে (বোল) বড় হাতের অক্ষর তৈরি করতে হয়েছিল (বিওএল), সম্ভবত একটি এলএলডিবি জিনিস।
ওয়েক্স

4
বুল জিডিবিতে আমার পক্ষে কাজ করেনি, আমাকে বিওওএল ব্যবহার করতে হয়েছিল বা পার্থক্যটি এখানে ব্যাখ্যা করা হয়েছে stackoverflow.com/a/544250/725871
চসফিয়ার 2112

4
আপনার যদি প্রতি একবার 200 গেম বাগ থাকে যা অবশেষে উঠে আসে তবে আপনি কোডে রাখতে পারবেন না এবং এখন আপনাকে শর্তসাপেক্ষ ব্রেকপয়েন্ট করতে হবে। কোড পরিবর্তন করতে প্রোগ্রাম বন্ধ করা কোনও বিকল্প নয়।
Almo

21

আপনি কীভাবে XCode lldb শর্তসাপেক্ষ ব্রেকপয়েন্ট ব্যবহার করছেন তা এখানে।

প্রথমে ব্রেক পয়েন্টে ডাবল ক্লিক করুন (বা ডান ক্লিক করুন edit breakpoint), আপনি একটি ডায়ালগ পপআপ দেখতে পাবেন।

এখানে চিত্র বর্ণনা লিখুন

এই বিকল্পগুলির অর্থ এখানে:

  1. শর্ত : ব্রেকপয়েন্টে কেবল এই শর্তে আগুন লাগবে।
  2. উপেক্ষা করুন : ব্রেকপয়েন্টে আগুন দেওয়ার আগে শর্তটি কতটা পূরণ করতে হবে
  3. ক্রিয়া : ব্রেকপয়েন্টের বিরতিতে চলে এমন ক্রিয়া।
  4. বিকল্পগুলি : ক্রিয়াগুলি মূল্যায়নের পরে স্বয়ংক্রিয়ভাবে চালিয়ে যান

এখানে একটি সংক্ষিপ্তসার। চিত্রের উপরের উদাহরণের জন্য, এর অর্থ হ'ল যখন ভেরিয়েবলটি buildingId13 এর সমান হয়, এখানে ব্রেক করুন। আমি যদি সময়টিকে অগ্রাহ্য করার সময়টিকে 1 এ যোগ করি, তবে এটি buildingId13 এর সমান হলে প্রথমবারটিকে উপেক্ষা করবে এবং দ্বিতীয় বার শর্ত পূরণ হওয়ার পরে বিরতি দেবে।

ক্রিয়াগুলির জন্য, আপনি যখন ক্রিয়া যুক্তগুলি চাপবেন তখন পছন্দের একটি তালিকা থাকবে। সাধারণত আমি যা করি তা হ'ল Debugger Command poভেরিয়েবলগুলি মুদ্রণের জন্য যা আমার যাচাই করা দরকার তা ব্যবহার করা এবং আমি বিশ্বাস করি যে আমার ক্রিয়াগুলি ব্যবহার করার পরে আরও ভাল উপায় রয়েছে।

দেখে মনে হচ্ছে আপনি রানটাইমে শর্ত পরিবর্তন করলে আপনাকে অ্যাপটি পুনরায় কম্পাইল করে চালাতে হবে


সম্ভবত কারণ প্রশ্নটি স্ট্রিংয়ের মান ভিত্তিতে ব্রেকপয়েন্টে থামার বিষয়ে ছিল [আমি ভোটার ছিলাম না]
জেডএস

4
ধন্যবাদ, বেশ সহায়ক। এই উত্তরটি আরও ভোটের দাবিদার।
andreskwan

7

এটি কার্যকর হবে কিনা তা সম্পর্কে আমি নিশ্চিত নই, তবে আপনি কোডের সেই লাইনে একটি ব্রেকপয়েন্ট স্থাপনের চেষ্টা করতে পারেন, ডিবাগার কনসোলটি খুলতে পারেন (সিএমডি + শিফট + আর), এবং টাইপ করুন

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

যেখানে ব্রেক ব্রেকপয়েন্টের সংখ্যা (একটি পূর্ণসংখ্যা) দ্বারা N কে প্রতিস্থাপন করা হয়।


2

যদি আপনি সেটারটি ব্যবহার করে myObj.name পরিবর্তন করেন তবে আপনি -[MyObjClass setName:]ডিবাগার কনসোল থেকে বা রান-> ব্রেকপয়েন্টগুলি পরিচালনা করুন-> এক্সকোডে প্রতীক ব্রেকআপপয়েন্ট মেনু যুক্ত করে একটি প্রতীকী ব্রেকআপপয়েন্ট যুক্ত করতে পারেন । যদি না হয় (কেন না? আপনি সম্ভবত নির্ধারিত ইনিশিয়ালাইজার বা ডেলোক ব্যতীত সরাসরি ইনস্ট্যান্স ভেরিয়েবলটি সংশোধন করবেন না) আপনি জিডিবিতে একটি ওয়াচপয়েন্ট সেট করতে পারেন (একবার ডিবাগার চলার পরে এক্সকোডে ডিবাগার কনসোল ব্যবহার করুন)। এই পৃষ্ঠাটি ব্যাখ্যা করে যে কীভাবে। আমি বিশ্বাস করি না যে ডিবাগার কনসোলটি ব্যবহার না করেই এক্সকোড ওয়াচপয়েন্টগুলি সেট করার জন্য একটি ইউআই প্রকাশ করে।


0

ফ্রেমওয়ার্ক (ডিবাগ বিল্ডস) নিয়ে কাজ করার সময় এবং নির্দিষ্ট ফাইল / অবস্থানের একটি ব্রেকপয়েন্ট স্থাপন করা দরকার যা নেভিগেট করা শক্ত বা বিকাশের অধীনে কাঠামোয় প্রকাশ্যে প্রকাশিত হয়নি isn't একটি বিকল্প হ'ল শর্তাধীন ব্রেকপয়েন্টগুলিকে ট্রিগার করতে এবং স্টেপ-ইন / স্টেপ-আউটকে আরও সহজ করার জন্য একটি সহায়ক শ্রেণি লিখুন।

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

বিকাশাধীন কাঠামোয় শিরোনামের ঘোষণা decla

#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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.