Watchpoint (পর্যবেক্ষণ বিন্দু) — একটি ডিবাগিং প্রক্রিয়া যা নির্দিষ্ট ভেরিয়েবল বা মেমরি অঞ্চলের মান পরিবর্তিত হলে প্রোগ্রাম এক্সিকিউশন বিরতি দেয়। breakpoint-এর বিপরীতে, যা কোডের একটি লাইনের সাথে আবদ্ধ, watchpoint ডেটা পরিবর্তনগুলি ট্র্যাক করে প্রোগ্রামের যে অংশেই পরিবর্তন ঘটুক না কেন। Apple Developer Documentation অনুসারে, ডেটা রেস, অপ্রত্যাশিত প্রপার্টি পরিবর্তন এবং অবজেক্ট লাইফসাইকেল ট্র্যাকিং ডিবাগ করার জন্য watchpoints অপরিহার্য।
মূল বিষয়
Watchpoint — একটি ডিবাগার প্রক্রিয়া যা নির্দিষ্ট মেমরি ঠিকানায় মান পরিবর্তিত হলে প্রোগ্রাম এক্সিকিউশন বিরতি দেয়। যদি breakpoint কোডের একটি নির্দিষ্ট লাইনে পৌঁছানোর উপর প্রতিক্রিয়া জানায়, তাহলে watchpoint একটি নির্দিষ্ট মেমরি কোষে লেখার উপর প্রতিক্রিয়া জানায় — কোডের কোন অংশটি লেখাটি সম্পাদন করেছে তা নির্বিশেষে। এটি এটিকে অপ্রত্যাশিত ভেরিয়েবল পরিবর্তন খুঁজে পেতে অপরিহার্য করে তোলে, বিশেষ করে মাল্টিথ্রেডেড অ্যাপ্লিকেশনে।
কাজের নীতি প্রসেসর হার্ডওয়্যার সমর্থনের উপর ভিত্তি করে। আধুনিক ARM চিপগুলি (Apple Silicon, Qualcomm Snapdragon) 4 থেকে 8টি হার্ডওয়্যার watchpoint রেজিস্টার প্রদান করে। যখন প্রসেসর একটি watchpoint-এর সাথে মেলে এমন ঠিকানায় লেখার নির্দেশ কার্যকর করে, তখন একটি হার্ডওয়্যার ইন্টারাপ্ট ঘটে, যা ডিবাগার ধরে ফেলে। যখন হার্ডওয়্যার রেজিস্টার শেষ হয়ে যায়, LLDB সফ্টওয়্যার মোডে স্যুইচ করে — এটি প্রতিটি লেখার নির্দেশ ধাপে ধাপে পরীক্ষা করে, এক্সিকিউশন দশগুণ ধীর করে দেয়।
ARM Architecture Reference Manual অনুসারে, হার্ডওয়্যার watchpoints Data Watchpoint and Trace (DWT) মডিউল স্তরে কাজ করে এবং এক্সিকিউটেবল কোডের পরিবর্তনের প্রয়োজন হয় না। প্রতিক্রিয়া সময় ন্যানোসেকেন্ডে, যা অডিও বা ভিডিও ফ্রেম বাফারের মতো ডেটা প্রসেসিং লুপে উচ্চ-ফ্রিকোয়েন্সি ভেরিয়েবল পরিবর্তনও ট্র্যাক করতে দেয়।
Watchpoint অপরিহার্য যখন আপনি জানেন কোন ভেরিয়েবল পরিবর্তিত হচ্ছে কিন্তু কোথা থেকে জানেন না। সাধারণ পরিস্থিতি: একটি UIView-এর frame প্রপার্টি স্পষ্ট কারণ ছাড়াই পরিবর্তিত হয়; ব্যাকগ্রাউন্ড থ্রেডের একটি কাউন্টার অপ্রত্যাশিতভাবে রিসেট হয়; একটি isLoading ফ্ল্যাগ নেটওয়ার্ক অনুরোধ সম্পূর্ণ হওয়ার আগেই স্যুইচ হয়। এই প্রতিটি ক্ষেত্রে, যেখানে লেখা হতে পারে এমন সমস্ত জায়গায় breakpoints সেট করা অব্যবহারিক। Watchpoint একটি একক কমান্ড দিয়ে সমস্যা সমাধান করে।
Xcode এবং LLDB তিন ধরনের watchpoints সমর্থন করে: watchpoint set variable — একটি লোকাল ভেরিয়েবল পর্যবেক্ষণের জন্য; watchpoint set expression — একটি এক্সপ্রেশন পর্যবেক্ষণের জন্য যা একটি ঠিকানা ফেরত দেয়; watchpoint set — একটি কাঁচা মেমরি ঠিকানা পর্যবেক্ষণের জন্য। প্রতিটি প্রকারের নিজস্ব প্রয়োগের ক্ষেত্র রয়েছে।
| Watchpoint প্রকার | LLDB কমান্ড | ব্যবহার |
|---|---|---|
| ভেরিয়েবল | watchpoint set variable -w write self.count | লোকাল এবং গ্লোবাল ভেরিয়েবল, স্ট্রাক্ট প্রপার্টি |
| এক্সপ্রেশন | watchpoint set expression -w write -- &self->mutex.lock | পয়েন্টার দ্বারা স্ট্রাক্ট ফিল্ড, ইনডেক্স দ্বারা অ্যারে এলিমেন্ট |
| ঠিকানা | watchpoint set -w write 0x600000c4b80 | পূর্ববর্তী LLDB আউটপুট থেকে নির্দিষ্ট মেমরি ঠিকানা |
Xcode-এ, আপনি ডিবাগ এরিয়ার মাধ্যমে watchpoint সেট করতে পারেন: breakpoint-এ থামুন, Variables View প্যানেলে পছন্দসই ভেরিয়েবল খুঁজুন, ডান-ক্লিক করুন এবং Watch Variable নির্বাচন করুন। Xcode স্বয়ংক্রিয়ভাবে সঠিক ভেরিয়েবল নাম এবং প্রসঙ্গ সহ watchpoint set variable কমান্ড কার্যকর করবে। এর পরে, ডিবাগার প্রতিটি মান পরিবর্তনে থামবে — কনসোলে স্যুইচ না করে দ্রুত ডিবাগিংয়ের জন্য সুবিধাজনক। তবে, এই পদ্ধতি কেবল তখনই কাজ করে যখন ভেরিয়েবল বর্তমান ফ্রেমের সুযোগের মধ্যে থাকে।
func processItems(_ items: [String]) {
var index = 0
// GUI-এর মাধ্যমে index-এ watchpoint সেট করুন:
// এখানে থামুন, ডান-ক্লিক করুন → Watch Variable
for item in items {
index += 1
print("আইটেম \(index): \(item)")
}
}
LLDB কনসোল থেকে watchpoints পরিচালনার জন্য কমান্ডের একটি সম্পূর্ণ সেট সরবরাহ করে। এটি GUI-এর চেয়ে বেশি নিয়ন্ত্রণ দেয়: আপনি পর্যবেক্ষণ অঞ্চলের আকার সেট করতে পারেন, ট্রিগার শর্ত নির্দিষ্ট করতে পারেন, গণনা করা এক্সপ্রেশন থেকে প্রাপ্ত ঠিকানায় watchpoints তৈরি করতে পারেন এবং ট্রিগারে স্বয়ংক্রিয়ভাবে ক্রিয়া সম্পাদন করতে পারেন। কমান্ড ইন্টারফেস বিশেষ করে জটিল পরিস্থিতি ডিবাগ করার সময় উপযোগী যেখানে দ্রুত পর্যবেক্ষণ প্যারামিটার পরিবর্তনের প্রয়োজন হয়।
watchpoint set variable কমান্ড সুযোগ বিবেচনা করে একটি ভেরিয়েবল নাম নেয়: Objective-C self-প্রপার্টির জন্য self->_property ব্যবহার করুন, Swift-এর জন্য self.property ব্যবহার করুন। -w write প্যারামিটার লেখা ট্র্যাকিং সেট করে, -w read — পড়া ট্র্যাকিং (একটি মোড যা কেবল কিছু আর্কিটেকচারে উপলব্ধ), -s size — বাইটে অঞ্চলের আকার। Watchpoint সেট করার পরে, আপনি watchpoint list কমান্ড দিয়ে তালিকা দেখতে পারেন।
(lldb) watchpoint set variable -w write -s 8 self.balance
Watchpoint 1: addr = 0x600000c4b80 size = 8 state = enabled type = w
watchpoint spec: 'self.balance'
(lldb) watchpoint set expression -w write -- self->items._storage
Watchpoint 2: addr = 0x600003a4c00 size = 8
(lldb) watchpoint list
1: location = 0x600000c4b80, type = write, variable = '_balance'
2: location = 0x600003a4c00, type = write, expression = 'self->items._storage'
Breakpoints-এর মতো, watchpoints শর্তসাপেক্ষ ট্রিগারিং সমর্থন করে। -c প্যারামিটার Swift বা Objective-C-এ একটি শর্ত সেট করে। উদাহরণস্বরূপ, newValue > 1000 শর্ত সহ একটি watchpoint কেবল তখনই থামবে যখন লেখা মান হাজারের বেশি হবে। এটি লুপ বা সেন্সর ডিবাগ করার সময় গুরুত্বপূর্ণ যা প্রতি সেকেন্ডে হাজার হাজার পরিবর্তন উৎপন্ন করে — অন্যথায় ডিবাগার প্রতিটি পরিবর্তনে থামবে, কাজ অসম্ভব করে তুলবে।
(lldb) watchpoint set variable -w write self.temperature -c "(int)$newValue > 100"
Watchpoint 3: addr = 0x600000e4a20, condition = '(int)$newValue > 100'
(lldb) watchpoint modify 3 -C "po self.temperature" -G true
// স্বয়ংক্রিয়ভাবে মান লগ করুন এবং এক্সিকিউশন চালিয়ে যান
Objective-C এবং Swift অবজেক্ট প্রপার্টির জন্য watchpoints-এর একটি বিশেষ বৈশিষ্ট্য — watchpoint প্রপার্টির নামে নয় বরং অবজেক্টের মেমরিতে ivar (ইনস্ট্যান্স ভেরিয়েবল) ফিল্ডের ঠিকানায় সেট হয়। এর অর্থ হল প্রতিটি নতুন অবজেক্ট বরাদ্দের সাথে (যেমন, ViewController পুনরায় তৈরি করার সময়), watchpoint অবৈধ হয়ে যায় কারণ মেমরি ঠিকানা পরিবর্তিত হয়েছে। পুনরায় চালু করার মধ্যে একটি প্রপার্টির স্থায়ী পর্যবেক্ষণের জন্য, আপনাকে অবজেক্ট ইনিশিয়ালাইজেশনের মুহূর্তে watchpoint পুনরায় সেট করতে হবে।
অ্যারে এবং অভিধানের এলিমেন্ট পর্যবেক্ষণের জন্য একটি নির্দিষ্ট এলিমেন্টের ঠিকানা গণনা করা প্রয়োজন। উদাহরণস্বরূপ, অ্যারের তৃতীয় এলিমেন্ট পর্যবেক্ষণের জন্য watchpoint set expression -- &array[2] ব্যবহার করুন। যদি অ্যারেটি তার অভ্যন্তরীণ বাফার পুনরায় বরাদ্দ করে (ক্ষমতার বাইরে এলিমেন্ট যোগ করার সময়), watchpoint অবৈধ হয়ে যায় — LLDB একটি ত্রুটি রিপোর্ট করবে Watchpoint 1 has an invalid address। এই ধরনের ক্ষেত্রে, কালেকশনের আকার পরিবর্তন করার পরে আপনাকে watchpoint পুনরায় সেট করতে হবে।
(lldb) expr var $arr = [10, 20, 30, 40, 50]
(lldb) watchpoint set expression -w write -- &$arr[2]
Watchpoint 4: addr = 0x1000a4b20, size = 8
(lldb) expr $arr[2] = 99
Watchpoint 4 hit: old value: 30, new value: 99
Objective-C-তে, আপনি objc_object স্ট্রাকচারের retainCount ফিল্ডে watchpoint সেট করে একটি অবজেক্টের retain count ট্র্যাক করতে পারেন। LLDB এটি watchpoint set expression -w write -- (int*)[object retainCount]-এর মাধ্যমে করে। তবে, ARC (অটোমেটিক রেফারেন্স কাউন্টিং) সহ Swift অবজেক্টের জন্য, retain count সরাসরি অ্যাক্সেসযোগ্য নয় — পরিবর্তে লিক বিশ্লেষণের জন্য Instruments বা Memory Graph Debugger ব্যবহার করুন। Apple-এর মতে, retain count-এ watchpoints কেবল ARC অপ্টিমাইজেশন নিষ্ক্রিয় সহ Debug বিল্ডে কাজ করে।
Watchpoints-এর বেশ কয়েকটি গুরুত্বপূর্ণ সীমাবদ্ধতা রয়েছে যা বিবেচনা করা প্রয়োজন। প্রধান — ARM আর্কিটেকচারে হার্ডওয়্যার watchpoints-এর সংখ্যা 4–8 রেজিস্টার এবং x86-এ 4 পর্যন্ত সীমাবদ্ধ। যখন সমস্ত হার্ডওয়্যার রেজিস্টার ব্যস্ত থাকে, LLDB সফ্টওয়্যার watchpoint মোডে স্যুইচ করে: এটি একটি ব্যতিক্রম তৈরি করতে ট্র্যাক করা পরিসরে প্রতিটি লেখার নির্দেশ পরিবর্তন করে। এটি এক্সিকিউশন 10–50 গুণ ধীর করে দেয়, তাই অনুশীলনে একসাথে 2–3টির বেশি সক্রিয় watchpoints ব্যবহার না করার পরামর্শ দেওয়া হয়।
দ্বিতীয় সীমাবদ্ধতা — মেমরি পুনরায় বরাদ্দের সময় watchpoints-এর অবৈধকরণ। যখন আবর্জনা সংগ্রহ বা ARC সক্রিয় হয়, এবং একটি অবজেক্ট মেমরিতে স্থানান্তরিত হয় (হিপ কম্প্যাকশন সহ ভাষাগুলিতে), watchpoint ঠিকানা ভুল হয়ে যায়। Swift এবং Objective-C-তে, ARC অবজেক্ট স্থানান্তরিত করে না, কিন্তু অ্যারে এবং স্ট্রিং পুনরায় বরাদ্দ একই প্রভাব সৃষ্টি করে। LLDB Watchpoint N address (0x...) doesn’t contain a valid allocation বার্তার মাধ্যমে এটি সম্পর্কে সতর্ক করে।
তৃতীয় সীমাবদ্ধতা — ভেরিয়েবল দৃশ্যমানতা। একটি লোকাল ভেরিয়েবলের watchpoint কেবল ততক্ষণ কাজ করে যতক্ষণ সেই ভেরিয়েবল বর্তমান স্ট্যাক ফ্রেমের সুযোগের মধ্যে থাকে। ফাংশন শেষ হওয়ার সাথে সাথে, watchpoint স্বয়ংক্রিয়ভাবে সরানো হয়। গ্লোবাল ভেরিয়েবল বা দীর্ঘস্থায়ী অবজেক্টের ফিল্ড পর্যবেক্ষণের জন্য, watchpoint watchpoint delete-এর মাধ্যমে স্পষ্টভাবে মুছে ফেলা বা প্রক্রিয়া শেষ না হওয়া পর্যন্ত থাকে।
(lldb) watchpoint delete 1
1 watchpoints deleted.
(lldb) watchpoint delete # সব watchpoints মুছুন
2 watchpoints deleted.
(lldb) watchpoint disable 1 # সাময়িকভাবে নিষ্ক্রিয় করুন
(lldb) watchpoint enable 1 # আবার সক্রিয় করুন
ARM-এর মতে, Apple Silicon (M1–M4)-এ watchpoints 1 থেকে 8 বাইট পর্যন্ত পর্যবেক্ষণ অঞ্চল সমর্থন করে। 8 বাইটের বড় স্ট্রাকচার পর্যবেক্ষণের জন্য, আপনাকে প্রতিটি ফিল্ডে একাধিক watchpoints সেট করতে হবে। এটি জটিল ডেটা স্ট্রাকচার যেমন CGRect (16 বাইট) বা UIEdgeInsets (16 বাইট) ডিবাগ করার সময় গুরুত্বপূর্ণ।
সচরাচর জিজ্ঞাসিত প্রশ্ন
Breakpoint কোডের একটি লাইনের সাথে আবদ্ধ — সেই লাইনে পৌঁছালে থামে। Watchpoint মেমরি ঠিকানার সাথে আবদ্ধ — প্রোগ্রামের যে কোনো জায়গা থেকে সেই ঠিকানায় লেখা হলে থামে। Watchpoint খোঁজে “কে মান পরিবর্তন করছে”, breakpoint খোঁজে “এই লাইনে কী ঘটছে”।
ARM-এ 4–8টি হার্ডওয়্যার watchpoints (Apple Silicon সহ)। এর বেশি watchpointকে সফ্টওয়্যার মোডে পরিবর্তন করে, এক্সিকিউশন 10–50 গুণ ধীর করে দেয়। একবারে 2–3টির বেশি সক্রিয় watchpoints ব্যবহার না করার পরামর্শ দেওয়া হয়।
Watchpoints ডিবাগিং সেশনের মধ্যে সংরক্ষিত হয় না। প্রতিটি নতুন লঞ্চে, মেমরি ঠিকানা পরিবর্তিত হয় এবং watchpoint পুনরায় সেট করতে হয়। ব্যতিক্রম হল নির্দিষ্ট ঠিকানা সহ গ্লোবাল ভেরিয়েবলের watchpoints।
হ্যাঁ, কিন্তু watchpoint প্রপার্টির ivar (ব্যাকিং স্টোরেজ) এ সেট হয়, প্রপার্টিতে নয়। Swift-এ, watchpoint set variable self.property ব্যবহার করুন — LLDB স্বয়ংক্রিয়ভাবে প্রপার্টি নাম দ্বারা সম্পর্কিত ivar খুঁজে পাবে।
হার্ডওয়্যার watchpoints পারফরম্যান্স প্রভাবিত করে না — ইন্টারাপ্ট প্রসেসর স্তরে ঘটে। সফ্টওয়্যার watchpoints (যখন হার্ডওয়্যার রেজিস্টার শেষ হয়ে যায়) এক্সিকিউশন 10–50 গুণ ধীর করে দেয়, কারণ LLDB প্রতিটি লেখার নির্দেশ পরীক্ষা করে।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন