Bosh sahifa Wiki Watchpoint

Watchpoint

Watchpointdebugger xotiradagi ma’lum joy o‘qilganda, yozilganda yoki qiymati o‘zgarganda dastur bajarilishini to‘xtatadigan kuzatuv nuqtasidir. Breakpoint kod manziliga bog‘langan bo‘lsa, watchpoint ma’lumotga kirishni kuzatadi. U “bu qiymat qayerda buzildi” degan savolni topishda ayniqsa foydali.

Hardware watchpoint

Ko‘p protsessorlarda debug registrlari manzil, kuzatiladigan amal turi va bayt uzunligini belgilaydi. CPU mos load yoki store bajarilganda debug exception chiqaradi. Bu usul har ko‘rsatmani software orqali tekshirmaydi va odatda tez. Biroq apparat slotlari juda kam, kuzatiladigan o‘lcham ham hizalanish va ISA cheklovlariga ega.

O‘zgaruvchi stackda bo‘lsa, funksiya qaytgach shu manzil boshqa maqsadga ishlatiladi. Heap obyekt ko‘chuvchi garbage collector tomonidan boshqa joyga ko‘chirilishi mumkin. Debugger symbol va runtime bilan hamkorlik qilmasa, eski manzilni kuzatishda davom etadi. Shuning uchun watchpointning obyekt hayot sikli va scope’i aniq tushuniladi.

Software usullari

Hardware imkoniyati yetmasa, debugger sahifani himoyalab, kirishda page fault ushlashi mumkin. Bu butun sahifadagi barcha murojaatlarni to‘xtatadi va juda qimmat. Boshqa yondashuv instrumentatsiya orqali har write oldiga tekshiruv qo‘shadi. Managed runtime property setter, observable collection yoki data breakpoint API bilan mantiqiy obyekt maydonini kuzatishi mumkin.

Change watchpoint yangi qiymat eskisidan farq qilgandagina to‘xtaydi. Read watchpoint maxfiy yoki noto‘g‘ri o‘qishni, access watchpoint esa o‘qish va yozishni qamrab oladi. Shartli watchpoint thread, qiymat diapazoni yoki call stackga qarab filtrlanishi mumkin, ammo har hodisada murakkab shart baholash ishlashga ta’sir qiladi.

Data race tahlili

Watchpoint bitta konkret yozuvchini topadi, lekin concurrency xatosining barcha interleavinglarini isbotlamaydi. Bir nechta thread bir maydonga sinxronizatsiyasiz kirsa, race detector yoki thread sanitizer kengroq instrumentatsiya beradi. Watchpoint timingni o‘zgartirib, race yo‘qolgandek ko‘rsatishi ham mumkin. Topilgan write lock, atomic va ownership qoidalari bilan birga tahlil qilinadi.

Optimallashtirilgan kodda lokal qiymat faqat registrda yashashi va xotira manziliga ega bo‘lmasligi mumkin. Compiler write’larni birlashtiradi yoki olib tashlaydi. Debug symbol location list o‘zgaruvchi qaysi diapazonda qaysi registr yoki stack offsetda ekanini ko‘rsatadi, lekin debugger har holatda watchpoint o‘rnata olmaydi.

Productionda sahifa himoyasi yoki ko‘p to‘xtash xizmatni buzishi mumkin. Core dump, sampling profiler va audit log kamroq invaziv alternativadir. Remote watchpoint qo‘yish debugging vakolatiga ega shaxs bilan cheklanadi, chunki xotira mazmuni token va shaxsiy ma’lumotni ochishi mumkin.

+## Kichik obyekt va false sharing

Hardware watchpoint ko‘pincha 1, 2, 4 yoki 8 bayt diapazonni kuzatadi. Bit field yoki katta struct uchun bir nechta slot kerak bo‘lishi mumkin. Kuzatiladigan maydon bilan bir cache line’dagi boshqa ma’lumot yozilishi hardware watchpointni emas, performance counterdagi false sharing signalini keltiradi; bu ikki tushuncha aralashtirilmaydi. Compiler packed struct yoki alignment sabab maydon offsetini o‘zgartirishi mumkin, shuning uchun source taxmini o‘rniga debug symbol manzili olinadi. Memory-mapped I/O registrini o‘qishning o‘zi yon ta’sirli bo‘lishi mumkin; debugger qiymatni avtomatik yangilashi qurilma xulqini o‘zgartiradi. Bunday targetda maxsus hardware hujjatiga amal qilinadi.

Allocator bir freed blokni quarantine’da vaqtincha saqlasa, use-after-free yozuvi boshqa obyektni darhol buzmaydi va watchpoint bilan topish osonlashadi. Bu debug rejim xatoni aniqlashga yordam beradi, lekin production allocator xulqi farq qilishi sabab yakuniy test real konfiguratsiyada ham bajariladi.

Bog‘liq tushunchalar

Breakpoint, Debugger, Hardware debug register, Data race, Memory address, Instrumentation, Core dump