Watchpoint (مشاہدہ پوائنٹ) — ڈیبگنگ کا ایک طریقہ کار جو پروگرام کے عمل کو روکتا ہے جب مخصوص متغیر یا میموری علاقے کی قدر تبدیل ہوتی ہے۔ بریک پوائنٹ کے برعکس، جو کوڈ کی ایک لائن سے منسلک ہوتا ہے، watchpoint ڈیٹا کی تبدیلیوں کو ٹریک کرتا ہے چاہے پروگرام کے کس حصے میں تبدیلی واقع ہو۔ Apple Developer Documentation کے مطابق، watchpoints ڈیٹا ریس، غیر متوقع خصوصیات کی تبدیلیوں اور آبجیکٹ لائف سائیکل ٹریکنگ کے ڈیبگنگ کے لیے ناگزیر ہیں۔
اہم نکات
Watchpoint — ڈیبگر کا ایک طریقہ کار ہے جو مخصوص میموری ایڈریس پر قدر تبدیل ہونے پر پروگرام کے عمل کو روکتا ہے۔ اگر بریک پوائنٹ کوڈ کی ایک مخصوص لائن تک پہنچنے پر ردعمل ظاہر کرتا ہے، تو 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 فلیگ نیٹ ورک کی درخواست مکمل ہونے سے پہلے تبدیل ہو جاتا ہے۔ ان میں سے ہر صورت میں، ان تمام جگہوں پر بریک پوائنٹس لگانا جہاں تحریر ہو سکتی ہے، غیر عملی ہے۔ 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 ترتیب دے سکتے ہیں: بریک پوائنٹ پر رکیں، 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'
بریک پوائنٹس کی طرح، 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 کی کئی اہم حدود ہیں جن پر غور کرنا ضروری ہے۔ اہم — ہارڈویئر watchpoints کی تعداد ARM آرکیٹیکچر پر 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 # تمام واچ پوائنٹس حذف کریں
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 (Apple Silicon سمیت) پر 4–8 ہارڈویئر watchpoints۔ اس سے تجاوز 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 ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں