Watchpoint (kuzatish nuqtasi) — ko‘rsatilgan o‘zgaruvchi yoki xotira sohasi qiymati o‘zgarganda dastur bajarilishini to‘xtatuvchi tuzatish mexanizmi. Breakpoint kod qatoriga bog‘langan bo‘lsa, watchpoint modifikatsiya dasturning qaysi qismida sodir bo‘lganidan qat‘iy nazar ma‘lumotlar o‘zgarishini kuzatadi. Apple Developer Documentation ga ko‘ra, watchpoint-lar ma‘lumot poygalari, kutilmagan xususiyat o‘zgarishlarini tuzatishda va ob‘ektlarning hayotiy siklini kuzatishda ajralmas hisoblanadi.
Asosiy ma’lumotlar
Watchpoint — ko‘rsatilgan xotira manzilidagi qiymat o‘zgarganda dastur bajarilishini to‘xtatuvchi tuzatish mexanizmi. Breakpoint ma’lum kod qatoriga yetganda reaksiya beradi, watchpoint esa ma’lum xotira katakchasiga yozilishiga reaksiya beradi — bu yozishni kodning qaysi qismi bajarganidan qat‘iy nazar. Bu uni ko‘p tarmoqli ilovalarda kutilmagan o‘zgaruvchi modifikatsiyalarini qidirishda ajralmas qiladi.
Ishlash prinsipi protsessorning apparat qo‘llab-quvvatlashiga asoslanadi. Zamonaviy ARM chiplari (Apple Silicon, Qualcomm Snapdragon) 4 dan 8 gacha apparat watchpoint registrlarini taqdim etadi. Protsessor watchpoint bilan mos keladigan manzilda yozish ko‘rsatmasini bajarganda, apparat uzilishi yuz beradi va uni tuzatuvchi ushlaydi. Apparat registrlari tugasa, LLDB dasturiy rejimga o‘tadi — har bir yozish ko‘rsatmasini qadam-baqadam tekshiradi, bu bajarilishni o‘nlab marta sekinlashtiradi.
ARM Architecture Reference Manual ga ko‘ra, apparat watchpoint-lari Data Watchpoint and Trace (DWT) moduli darajasida ishlaydi va bajariladigan kodni o‘zgartirishni talab qilmaydi. Ishga tushish reaksiya vaqti nanosekundlarni tashkil etadi, bu audio buferlar yoki video kadrlar kabi ma’lumotlarni qayta ishlash sikllarida yuqori chastotali o‘zgaruvchi o‘zgarishlarini kuzatishga imkon beradi.
Watchpoint qaysi o‘zgaruvchi o‘zgarayotganini bilganingizda, lekin qayerdan o‘zgarayotganini bilmaganingizda ajralmasdir. Oddiy stsenariylar: UIView-dagi frame xususiyati qiymati ko‘rinadigan sababsiz o‘zgaradi; fon tarmog‘idagi hisoblagich kutilmagan tarzda nollanadi; isLoading bayrog‘i tarmoq so‘rovi tugashidan oldin o‘zgaradi. Bu holatlarning har birida yozish sodir bo‘lishi mumkin bo‘lgan barcha joylarga breakpoint qo‘yish amaliy emas. Watchpoint muammoni bitta buyruq bilan hal qiladi.
Xcode va LLDB uch turdagi watchpoint-ni qo‘llab-quvvatlaydi: watchpoint set variable — mahalliy o‘zgaruvchini kuzatish uchun; watchpoint set expression — manzil qaytaruvchi ifodani kuzatish uchun; watchpoint set — xom xotira manzilini kuzatish uchun. Har bir turning o‘z qo‘llanish sohasi bor.
| Watchpoint turi | LLDB buyrug‘i | Qo‘llanish |
|---|---|---|
| O‘zgaruvchi | watchpoint set variable -w write self.count | Mahalliy va global o‘zgaruvchilar, struktura xususiyatlari |
| Ifoda | watchpoint set expression -w write -- &self->mutex.lock | Ko‘rsatkich orqali struktura maydonlari, indeks bo‘yicha massiv elementlari |
| Manzil | watchpoint set -w write 0x600000c4b80 | LLDB ning oldingi chiqishidan aniq xotira manzili |
Xcode-da watchpoint Debug Area orqali o‘rnatilishi mumkin: breakpoint-da to‘xtang, Variables View panelida kerakli o‘zgaruvchini toping, sichqonchaning o‘ng tugmasini bosing va Watch Variable ni tanlang. Xcode avtomatik ravishda to‘g‘ri o‘zgaruvchi nomi va kontekst bilan watchpoint set variable buyrug‘ini bajaradi. Shundan so‘ng tuzatuvchi har bir qiymat o‘zgarishida to‘xtaydi — konsolga o‘tmasdan tezkor tuzatish uchun qulay. Biroq bu usul faqat o‘zgaruvchi joriy ramka ko‘rinish sohasida bo‘lganda ishlaydi.
func processItems(_ items: [String]) {
var index = 0
// Index-ga watchpoint-ni GUI orqali o'rnating:
// shu yerda to'xtang, o'ng tugma → Watch Variable
for item in items {
index += 1
print("Item \(index): \(item)")
}
}
LLDB konsoldan watchpoint-larni boshqarish uchun to‘liq buyruqlar to‘plamini taqdim etadi. Bu GUI-dan ko‘ra ko‘proq nazorat beradi: kuzatish sohasi hajmini belgilash, ishga tushish shartini o‘rnatish, hisoblangan ifodalardan olingan manzillarda watchpoint yaratish va ishga tushganda avtomatik harakatlarni bajarish mumkin. Buyruq qatori interfeysi kuzatish parametrlarini tez o‘zgartirish talab qilinadigan murakkab stsenariylarni tuzatishda ayniqsa foydalidir.
watchpoint set variable buyrug‘i ko‘rinish sohasini hisobga olgan holda o‘zgaruvchi nomini qabul qiladi: Objective-C self xususiyatlari uchun self->_property, Swift uchun self.property dan foydalaning. -w write parametri yozishni kuzatishni, -w read — o‘qishni (faqat ba’zi arxitekturalarda mavjud rejim), -s size — soha hajmini baytlarda belgilaydi. Watchpoint o‘rnatilgandan so‘ng ro‘yxatni watchpoint list buyrug‘i bilan ko‘rish mumkin.
(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'
Breakpoint-lar kabi, watchpoint-lar ham shartli ishga tushishni qo‘llab-quvvatlaydi. -c parametri Swift yoki Objective-C da shart belgilaydi. Masalan, newValue > 1000 sharti bilan watchpoint faqat yozilgan qiymat mingdan oshganda to‘xtaydi. Bu sekundiga minglab o‘zgarishlar yaratadigan sikllar yoki sensorlarni tuzatishda juda muhim — aks holda tuzatuvchi har bir o‘zgarishda to‘xtab, ishni imkonsiz qiladi.
(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
// Avtomatik ravishda qiymatni logga yozib, bajarilishni davom ettir
Objective-C va Swift ob‘ekt xususiyatlari uchun watchpoint-larning o‘ziga xosligi — watchpoint xususiyat nomiga emas, balki ob‘ekt xotirasidagi ivar (misol o‘zgaruvchisi) maydoni manziliga o‘rnatiladi. Bu shuni anglatadiki, har bir yangi ob‘ekt ajratilganda (masalan, ViewController qayta yaratilganda), watchpoint haqiqiy emas bo‘ladi, chunki xotira manzili o‘zgargan. Xususiyatni qayta ishga tushirishlar davomida doimiy kuzatish uchun watchpoint ob‘ektni ishga tushirish vaqtida qayta o‘rnatilishi kerak.
Massiv va lug‘at elementlarini kuzatish aniq element manzilini hisoblashni talab qiladi. Masalan, massivning uchinchi elementini kuzatish uchun watchpoint set expression -- &array[2] dan foydalaning. Massiv ichki buferni qayta ajratsa (capacity dan ortiq element qo‘shilganda), watchpoint haqiqiy emas bo‘ladi — LLDB Watchpoint 1 has an invalid address xatosini bildiradi. Bunday hollarda to‘plam hajmi o‘zgargandan so‘ng watchpoint-ni qayta o‘rnatish kerak.
(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 da objc_object strukturasidagi retainCount maydoniga watchpoint o‘rnatib, ob‘ektning retain count ini kuzatish mumkin. LLDB buni watchpoint set expression -w write -- (int*)[object retainCount] orqali bajaradi. Biroq, ARC (Automatic Reference Counting) bilan Swift ob‘ektlari uchun retain count to‘g‘ridan-to‘g‘ri mavjud emas — uning o‘rniga xotira oqishini tahlil qilish uchun Instruments yoki Memory Graph Debugger dan foydalaning. Apple ga ko‘ra, retain count dagi watchpoint-lar faqat ARC optimallashtirishi o‘chirilgan Debug qurilmalarida ishlaydi.
Watchpoint-larning e‘tiborga olinishi kerak bo‘lgan bir qator cheklovlari bor. Asosiysi — apparat watchpoint-larining soni ARM arxitekturasida 4–8 registr va x86 da 4 registr bilan cheklangan. Barcha apparat registrlari band bo‘lganda, LLDB dasturiy watchpoint rejimiga o‘tadi: kuzatilgan diapazondagi har bir yozish ko‘rsatmasini istisno yaratish uchun o‘zgartiradi. Bu bajarilishni 10–50 marta sekinlashtiradi, shuning uchun amalda bir vaqtning o‘zida 2–3 tadan ko‘p faol watchpoint dan foydalanish tavsiya etilmaydi.
Ikkinchi cheklov — xotirani qayta ajratishda watchpoint-larning haqiqiy emas bo‘lishi. Axlat yig‘uvchi yoki ARC ishlaganda, ob‘ekt xotirada ko‘chirilganda (to‘plamni ixchamlashtiruvchi tillarda), watchpoint manzili noto‘g‘ri bo‘ladi. Swift va Objective-C da ARC ob‘ektlarni ko‘chirmaydi, lekin massiv va satrlarni qayta ajratish bir xil effektga olib keladi. LLDB bu haqda Watchpoint N address (0x...) doesn't contain a valid allocation xabari bilan ogohlantiradi.
Uchinchi cheklov — o‘zgaruvchilarning ko‘rinishi. Mahalliy o‘zgaruvchiga qo‘yilgan watchpoint faqat shu o‘zgaruvchi joriy stek ramkasining ko‘rinish sohasida bo‘lganda ishlaydi. Funksiya tugashi bilan watchpoint avtomatik ravishda o‘chiriladi. Global o‘zgaruvchilar yoki uzoq muddatli ob‘ektlar maydonlarini kuzatish uchun watchpoint watchpoint delete bilan aniq o‘chirilguncha yoki jarayon tugaguncha saqlanadi.
(lldb) watchpoint delete 1
1 watchpoints deleted.
(lldb) watchpoint delete # Barcha watchpoint larni o'chirish
2 watchpoints deleted.
(lldb) watchpoint disable 1 # Vaqtinchalik o'chirish
(lldb) watchpoint enable 1 # Qayta yoqish
ARM ga ko‘ra, Apple Silicon (M1–M4) dagi watchpoint-lar 1 dan 8 baytgacha bo‘lgan kuzatiladigan soha hajmini qo‘llab-quvvatlaydi. 8 baytdan katta strukturalarni kuzatish uchun har bir maydonga bir nechta watchpoint o‘rnatish talab qilinadi. Bu CGRect (16 bayt) yoki UIEdgeInsets (16 bayt) kabi murakkab ma’lumotlar strukturalarini tuzatishda muhimdir.
Ko‘p beriladigan savollar
Breakpoint kod qatoriga bog‘langan — unga yetganda to‘xtaydi. Watchpoint xotira manziliga bog‘langan — dasturning istalgan joyidan shu manzilga yozilganda to‘xtaydi. Watchpoint “kim qiymatni o‘zgartiryapti” ni qidiradi, breakpoint “bu qatorda nima sodir bo‘lyapti” ni qidiradi.
ARM da (Apple Silicon bilan) 4–8 apparat watchpoint. Chegaradan oshish watchpoint-ni dasturiy rejimga o‘tkazadi, bu bajarilishni 10–50 marta sekinlashtiradi. Bir vaqtning o‘zida 2–3 tadan ko‘p faol watchpoint tavsiya etilmaydi.
Watchpoint-lar tuzatish seanslari orasida saqlanmaydi. Har bir yangi ishga tushirishda xotira manzillari o‘zgaradi va watchpoint qayta o‘rnatilishi kerak. Istisno — qat‘iy manzilli global o‘zgaruvchilardagi watchpoint-lar.
Ha, lekin watchpoint xususiyatning o‘ziga emas, balki uning ivar (zaxira saqlash) maydoniga o‘rnatiladi. Swift da watchpoint set variable self.property dan foydalaning — LLDB xususiyat nomi bo‘yicha mos ivar-ni avtomatik topadi.
Apparat watchpoint ishlashga ta‘sir qilmaydi — uzilish protsessor darajasida sodir bo‘ladi. Dasturiy (apparat registrlari tugaganda) bajarilishni 10–50 marta sekinlashtiradi, chunki LLDB har bir yozish ko‘rsatmasini tekshiradi.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.