ভিজ্যুয়াল স্টুডিও ডিবাগার ব্যবহার করে কোনও মান পরিবর্তিত হলে ভাঙ্গন


198

ভেরিয়েবলের উপরে একটি ঘড়ি রাখার কোনও উপায় আছে এবং যখন সেই মান পরিবর্তন হয় কেবলমাত্র ভিজ্যুয়াল স্টুডিও ব্রেক হয়?

জটিল রাষ্ট্রীয় সমস্যাগুলি খুঁজে পাওয়া এত সহজ করে তুলবে।

এই কাজ করা যাবে?

ব্রেকপয়েন্টের অবস্থার জন্য এখনও একটি ব্রেকপয়েন্ট সেট দরকার, এবং আমি বরং একটি ঘড়ি সেট করব এবং ভিজ্যুয়াল স্টুডিওকে রাষ্ট্র পরিবর্তনগুলির জন্য ব্রেকপয়েন্টগুলি সেট করতে দেব।


তবে ব্রেকপয়েন্টটি শর্তটি ধরে না থাকলে কোনও কিছুই প্রভাবিত করে না, সুতরাং আপনি আপনার ব্রেকপয়েন্টটি যে কোনও জায়গায় রাখতে পারেন (সেটারের মতো) এবং সেখান থেকে নিয়ে যেতে পারেন। নাকি আমি কিছু মিস করছি?
ওসকার

6
আমরা হব. এটি ডিবাগিংয়ের vb6 উপায়ের মতো। আপনি ব্রেকপয়েন্ট অবস্থান সম্পর্কে যত্ন নেবেন না। উইন্ডোটি দেখার জন্য কেবল শর্তসাপেক্ষ অভিব্যক্তি যুক্ত করুন এবং vb6 গ্যারান্টি দিবে যেখানে শর্তটি দেখা হবে সেখানেই এটি ভেঙে যাবে ..
গুলজার নাজিম

দুঃখিত, কোনও উপায় কখনও দেখেনি, যতদূর আমি জানি সেস্টার যাওয়ার উপায়
ওসকর

1
আমি আরও ভাল খবর খুঁজে প্রত্যাশী ছিল; vs2010 ইঙ্গিত পরিবর্তন msdn.microsoft.com/en-us/library/350dyxd0.aspx শুধুমাত্র নেটিভ C ++ এই @Scottgu আপনি আরো ভালো করতে পারে হয়েছে!
জেরি লাউরি

উত্তর:


134

ভিজ্যুয়াল স্টুডিও 2005 মেনুতে:

ডিবাগ -> নতুন ব্রেকপয়েন্ট -> নতুন ডেটা ব্রেকপয়েন্ট

প্রবেশ করান:

&myVariable

38
এটি কি পরিচালিত কোডের জন্য উপলব্ধ? আমি সি # প্রকল্পের জন্য এই বিকল্পটি অক্ষম দেখতে পাচ্ছি। মনে রাখবেন কোথাও পড়ার এটি ডিবাগিং পরিচালিত অ্যাপ্লিকেশনগুলিতে বিশেষত জঞ্জাল সংগ্রহকারী জড়িতদের সাথে প্রয়োগ করার জন্য একটি শক্ত বৈশিষ্ট্য।
গুলজার নাজিম

27
: এটা অপরিচালিত কোড, দুর্ভাগ্যবশত শুধু উপলব্ধ msdn.microsoft.com/en-us/library/350dyxd0.aspx
জোশ Kodroff

17
আপনি সাময়িকভাবে কোনও ক্ষেত্রকে একটি সম্পত্তিতে রূপান্তর করতে এবং গেটর বা সেটারের উপর একটি ব্রেকপয়েন্ট রাখতে পারেন।
জন ডেভিস

12
"ডিবাগ -> নতুন ব্রেকপয়েন্ট" এর অধীনে "ডেটা ব্রেকপয়েন্ট" বিকল্পটি অক্ষম .. কোনও ধারণা কেন? এটি অক্ষম থাকে বা না আসলে আমি ডিবাগ করি বা না। আমি ভিজ্যুয়াল স্টুডিও 2015 ব্যবহার করছি।
jbb

2
কিছুটা দেরি হলেও আমার জন্য @ জেবিবি এটি তখনই সক্ষম করা হবে যখন আমি ডিবাগ করার সময় ব্রেক পয়েন্টে থামি।
Allball103

27

আপনি কোডে স্পষ্টভাবে বিরতি চয়ন করতে পারেন:

// Assuming C#
if (condition)
{
    System.Diagnostics.Debugger.Break();
}

এমএসডিএন থেকে:

ডিবাগার.ব্রেক: কোনও ডিবাগার সংযুক্ত না থাকলে, ব্যবহারকারীরা যদি কোনও ডিবাগার সংযুক্ত করতে চান কিনা তা জিজ্ঞাসা করা হয়। যদি হ্যাঁ, তবে ডিবাগারটি শুরু হয়েছে। যদি কোনও ডিবাগারটি সংযুক্ত থাকে, তবে ডিবাগারটি একটি ব্যবহারকারী ব্রেকপয়েন্ট ইভেন্টের সাথে সংকেতযুক্ত হয় এবং ডিবাগারটি প্রক্রিয়া সম্পাদন স্থগিত করে ঠিক যেমন কোনও ডিবাগার ব্রেকপয়েন্টে আঘাত হানা দেওয়া হয়েছিল।

যদিও এটি কেবল একটি ফ্যালব্যাক। অন্যান্য মন্তব্যে বর্ণিত ভিজ্যুয়াল স্টুডিওতে শর্তসাপেক্ষ ব্রেকআপপয়েন্ট সেট করা আরও ভাল পছন্দ।


2
এফডব্লিউআইডাব্লু, সম্পাদনা সহ এবং চালিয়ে যেতে আমি এটি এইভাবে করা পছন্দ করি: আইএমই, শর্তসাপেক্ষ ব্রেকআপপয়েন্টগুলি স্লুও
মার্ক সোওল

এটি কাজ করে - তবে এটি অত্যন্ত বেদনাদায়ক - আমি অনুরূপ কিছু করতে পেরেছি - আমি সন্দেহ করি এমন প্রতিটি পদ্ধতির শীর্ষে রেখেছি - এবং আবার নীচে (শেষ অবধি) - এইভাবে আমি জানতাম ঠিক কোনটি পদ্ধতিটি সমস্যা তৈরি করছিল - (যেমন আমি জানতাম যে পদ্ধতিতে প্রবেশের আগে ডেটাটি ভাল ছিল এবং তারপরে বেরোনোর ​​আগে খারাপ)।
BrainSlugs83

26

সত্যিই পুরানো পোস্ট তবে যদি কেউ অজানা ...

ইন ভিসুয়াল স্টুডিও 2015 , আপনি একটি ব্রেকপয়েন্ট স্থাপন করতে পারেন setএকটি স্বয়ংক্রিয় বাস্তবায়িত বৈশিষ্ট্যের অ্যাকসেসর এবং ডিবাগার যখন সম্পত্তি আপডেট করা হয় ভঙ্গ করবে

public bool IsUpdated
{
    get;
    set;    //set breakpoint on this line
}

হালনাগাদ

বিকল্পভাবে; @AbdulRaufMujahid মন্তব্য নির্দিষ্ট করেছে যে যদি স্বয়ং বাস্তবায়িত সম্পত্তি একটি একক লাইন চালু থাকে, তখন তোমার দিকে আপনার কার্সার উপস্থাপন করতে পারেন get;বা set;এবং আঘাত F9এবং ব্রেকপয়েন্ট তদনুসারে স্থাপন করা হবে। নিস!

public bool IsUpdated { get; set; }

5
এমনকি যদি স্বয়ংক্রিয়ভাবে প্রয়োগ করা সম্পত্তি এক লাইনে থাকে যেমন পাবলিক স্ট্রিং ব্যবহারকারী নাম {সেট; পাওয়া; }। ব্যবহারকারী গেটর বা সেটারটি হাইলাইট করতে পারে এবং ব্রেকপয়েন্ট যুক্ত করতে F9 টিপতে পারে
আব্দুল রউফ

@ আবদুলআরউফ মুজাহিদ দুর্দান্ত!
ক্রেগ

13

নিম্নলিখিত ঘোষণার সাথে আপনার কাছে একটি ক্লাস রয়েছে তা কল্পনা করুন।

class A  
{  
    public:  
        A();

    private:
        int m_value;
};

যখন কেউ "এম_ভ্যালু" এর মান পরিবর্তন করে আপনি প্রোগ্রামটি থামতে চান।

ক্লাসের সংজ্ঞাতে যান এবং এ এর ​​কনস্ট্রাক্টরে একটি ব্রেকপয়েন্ট রাখুন

A::A()
{
    ... // set breakpoint here
}

একবার আমরা প্রোগ্রামটি বন্ধ করে দিয়েছিলাম:

ডিবাগ -> নতুন ব্রেকপয়েন্ট -> নতুন ডেটা ব্রেকপয়েন্ট ...

ঠিকানা: & (এটি-> মি_মূল্য)
বাইট গণনা: 4 (কারণ 4 টি বাইট রয়েছে)

এখন, আমরা প্রোগ্রামটি আবার শুরু করতে পারি। মান পরিবর্তন করা হলে ডিবাগারটি থামবে।

উত্তরাধিকারসূত্রে প্রাপ্ত ক্লাস বা যৌগিক ক্লাসগুলির সাথেও আপনি এটি করতে পারেন।

class B
{
   private:
       A m_a;
};

ঠিকানা: & (এটি-> m_a.m_value)

আপনি যে ভেরিয়েবলটির পরিদর্শন করতে চান তার সংখ্যাগুলি যদি না জানেন তবে আপনি আকারের অপারেটরটি ব্যবহার করতে পারেন।

উদাহরণ স্বরূপ:

// to know the size of the word processor,  
// if you want to inspect a pointer.
int wordTam = sizeof (void* ); 

আপনি যদি "কল স্ট্যাক" দেখেন তবে আপনি এমন ফাংশনটি দেখতে পারেন যা ভেরিয়েবলের মান পরিবর্তন করে।


1
সুতরাং, আমি যা খুঁজছি তা আমার নিজের ক্লাসে না থাকলে আপনি ঠিক কী করবেন? যেমন, উদাহরণস্বরূপ, আমি ঠিক কোথায় নিয়ন্ত্রণ সক্ষম বা অক্ষম হয়ে যায় তা অনুসন্ধান করার চেষ্টা করছি? আমি অবশ্যই ডিবাগিংয়ের সময় নিয়ন্ত্রণের সক্ষম মানগুলিতে একটি ঘড়ি যুক্ত করতে পারি, অবশ্যই, তবে এটি পরিবর্তনকে ভেঙে ফেলার এবং তারপর কোথায় থামেছে তা দেখার কোনও উপায় নেই।
নাইয়ারগডস

2
আপনি যদি কোনও বাহ্যিক লাইব্রেরি ডিবাগ করার চেষ্টা করেন তবে আপনার লাইব্রেরিটি ডিবাগ মোডে সংকলিত প্রয়োজন। আমি উপাদানটির সাথে পরিচিত নই, তবে আপনি সম্পত্তিটির সাথে একটি "কলব্যাক" সংযুক্ত করতে পারেন এবং ভিতরে ব্রেকআপপয়েন্ট রাখতে পারেন। আমি যে ফর্মটি বর্ণনা করি তার জন্য মেমরি ঠিকানা প্রয়োজন, যদি আপনার এটি জানার কোনও উপায় না থাকে, তবে অন্যান্য পদ্ধতি অনুসন্ধান করতে হবে।
মোম্বোকো

9

ভেরিয়েবলটিকে একটি সম্পত্তিতে পরিবর্তন করুন এবং সেট পদ্ধতিতে একটি ব্রেকপয়েন্ট যুক্ত করুন। উদাহরণ:

private bool m_Var = false;
protected bool var
{
    get { 
        return m_var;
    }

    set { 
        m_var = value;
    }
}

3

আপনি যদি ডাব্লুপিএফ ব্যবহার করে থাকেন তবে একটি দুর্দান্ত সরঞ্জাম রয়েছে: ডাব্লুপিএফ পরিদর্শক
এটি নিজেকে একটি ডাব্লুপিএফ অ্যাপ্লিকেশনে সংযুক্ত করে এবং সমস্ত বৈশিষ্ট্যের সাথে নিয়ন্ত্রণের পূর্ণ গাছ প্রদর্শন করে, এটি আপনাকে (অন্যান্য জিনিসগুলির মধ্যে) যেকোন সম্পত্তি পরিবর্তনের জন্য বিরতি দেয়।

তবে দুঃখের সাথে আমি এমন কোনও সরঞ্জাম পাইনি যা আপনাকে কোনও সম্পত্তি বা ভেরিয়েবলের সাহায্যে একই কাজ করতে দেয়।


3

ভিজুয়াল বেসিক .0.০ ব্যবহার করে আপনি যেভাবে বর্ণনা করেছেন তা আমার মনে আছে । ভিজ্যুয়াল স্টুডিওতে, আমি এখন পর্যন্ত যে একমাত্র পথ খুঁজে পেয়েছি তা হল একটি ব্রেকপয়েন্ট শর্ত নির্দিষ্ট করে ।


2

ব্রেকপয়েন্টে ডান ক্লিকটি আমার জন্য সূক্ষ্মভাবে কাজ করে (যদিও বেশিরভাগ ক্ষেত্রে আমি এটি নির্দিষ্ট ভেরিয়েবল মানগুলিতে শর্তাধীন ব্রেকপয়েন্টের জন্য ব্যবহার করি Even এমনকি একটি থ্রেড নাম জড়িত অভিব্যক্তিগুলিকেও ভেঙে দেয় যা আপনি থ্রেডিংয়ের বিষয়গুলি স্পট করার চেষ্টা করলে খুব দরকারী)।


2

পিটার মর্টেনসেন যেমন লিখেছেন:

ভিজ্যুয়াল স্টুডিও 2005 মেনুতে:

ডিবাগ -> নতুন ব্রেকপয়েন্ট -> নতুন ডেটা ব্রেকপয়েন্ট

প্রবেশ করান: এবং আমার পরিবর্তনশীল

অতিরিক্ত তথ্য:

স্পষ্টতই, সিস্টেমটি অবশ্যই জানতে হবে মেমোরিতে কোন ঠিকানাটি দেখতে হবে। সুতরাং - myVariable(বা myClass.m_Variable) এর সূচনা করার জন্য একটি সাধারণ ব্রেকপয়েন্ট সেট করুন - সিস্টেমটি চালান এবং এটি সেই ব্রেকপয়েন্টে থামার অবধি অপেক্ষা করুন। - এখন মেনু এন্ট্রি সক্ষম হয়েছে, এবং আপনি প্রবেশ করে ভেরিয়েবলটি দেখতে পারেন &myVariable, বা উদাহরণটি প্রবেশ করে দেখতে পারেন&myClass.m_Variable । এখন ঠিকানাগুলি ভালভাবে সংজ্ঞায়িত করা হয়েছে।

ইতিমধ্যে প্রদত্ত সমাধানটি ব্যাখ্যা করে যখন আমি কিছু ভুল করেছি তখন দুঃখিত। তবে আমি কোনও মন্তব্য যুক্ত করতে পারিনি, এবং এ সম্পর্কে কিছু মন্তব্যও রয়েছে।


1

আপনি পরিচালনা না করা কোডটিতে একটি মেমরির ওয়াচপয়েন্ট ব্যবহার করতে পারেন। এগুলি যদিও পরিচালিত কোডে পাওয়া যায় তা নিশ্চিত নয়।


1

আপনি সম্ভবত ডিবাগব্রাক () ফাংশনটির একটি চতুর ব্যবহার করতে পারেন ।


ঠিক কীভাবে? একটি টাইট লুপে পৃথক থ্রেড চালিয়ে এবং যখনই কোনও পরিবর্তন দেখা গিয়েছে তখনই ডিগব্র্যাক () ডাকে?
স্পষ্টভাবে

@ নলপি আপনি উদাহরণস্বরূপ myVariableসহায়ক previousValueভেরিয়েবল ব্যবহারের পরে যে জায়গাগুলি ব্যবহৃত হয় তা চিহ্নিত করতে পারেন এবং এর মানগুলি সংরক্ষণ করতে পারেন , তারপরে ডাবগব্রেক () কল করুন myVariable!=previousValue; তাহলে আপনি জানতে পারবেন কোন কোড ব্লকের myVariableমধ্যে পরিবর্তন হয়েছে। তবে আমি সম্মত যে অ্যাশেলি এর সমাধান সবচেয়ে ভাল।
মুছুন

1

আপনি বৈকল্পিকভাবে চলকটির জন্য = অপারেটরটিকে ওভারলোড করতে পারেন এবং নির্দিষ্ট অবস্থাতে ওভারলোড হওয়া ফাংশনের ভিতরে ব্রেকপয়েন্টটি রাখতে পারেন।


1

2019 সালে আপডেট:

নেট কোর 3.0.০ বা তার বেশি এর জন্য এটি এখন ভিজ্যুয়াল স্টুডিও 2019 প্রিভিউ 2 তে আনুষ্ঠানিকভাবে সমর্থিত। অবশ্যই, আপনাকে আইডিইর পূর্বরূপ সংস্করণ ব্যবহারের সম্ভাব্য ঝুঁকিতে কিছু চিন্তাভাবনা রাখতে হবে। আমি ভাবছি অদূর ভবিষ্যতে এটি সরকারী ভিজ্যুয়াল স্টুডিওতে অন্তর্ভুক্ত হবে।

https://blogs.msdn.microsoft.com/visualstudio/2019/02/12/break-when-value-changes-data-breakpoints-for-net-core-in-visual-studio-2019/

ভাগ্যক্রমে, ডেটা ব্রেকপয়েন্টগুলি এখন আর সি ++ একচেটিয়া নয় কারণ তারা এখন ভিজ্যুয়াল স্টুডিও 2019 প্রিভিউ 2 তে .NET কোর (3.0 বা তার চেয়ে বেশি) এর জন্য উপলব্ধ!

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