Debugging asoslari: xatoni topish va tuzatish

Debugging — dastur nega kutilgandek ishlamayotganini topish va tuzatish jarayoni. Har bir dasturchi xato qiladi; muhim ko’nikma “ishlamayapti” degan umumiy holatni aniq sababga aylantirishdir.
Xatolarning uch turi
| Tur | Belgisi | Misol |
|---|---|---|
| Sintaksis xatosi | Dastur ishga tushmaydi | Qavs yoki qo’shtirnoq yopilmagan |
| Runtime xatosi | Ishlayotganda to’xtaydi | Mavjud bo’lmagan qiymatdan foydalanish |
| Mantiqiy xato | Ishlaydi, natija noto’g’ri | Chegirmani 10 o’rniga 100 ga bo’lish |
Xato xabarini o’qing: unda odatda fayl, qator va muammo turi ko’rsatiladi.
Ishonchli tartib
- Takrorlang: qaysi aniq amal xatoga olib kelishini yozing.
- Solishtiring: kutilgan va haqiqiy natijani ayting.
- Kichraytiring: eng kichik ishlamaydigan misolni qoldiring.
- Kuzating:
print, Console yoki debugger bilan oraliq qiymatlarni tekshiring. - Bitta taxminni sinang: bir paytda ko’p narsani o’zgartirmang.
- Qayta tekshiring: tuzatish avval ishlagan holatlarni buzmaganini ham sinang.
Xato xabarini o’qish usuli
Xato xabari dasturchini ayblamaydi; u dastur qayerda o’z kutgan holatini topmaganini bildiradi. Avval xabar turini, keyin fayl va qator raqamini, undan so’ng siz yozgan kod parchasini ko’ring. Qator raqami har doim mutlaq sabab bo’lmasligi mumkin: masalan, ochilmagan qo’shtirnoq xatosi keyingi qatorda ko’rinishi mumkin. Shuning uchun ko’rsatilgan joyning yuqori-pastidagi belgilarni ham tekshiring.
Quyidagi gaplarni alohida yozib qo’yish foydali: “men nima kutgandim?”, “aslida nima bo’ldi?”, “bu holat qaysi kirish bilan takrorlanadi?”. Masalan, xarajatlar hisoblagichi bo’sh natija bersa, foydalanuvchi kiritgan summa matn bo’lganmi, uni songa aylantirish qayerda bo’lgan, ro’yxat bo’sh emasmi — ketma-ket tekshiriladi.
Oraliq qiymat bilan dalil yig’ish
print yoki brauzer Console’i debuggingning eng sodda vositasi. Biroq hamma narsani chiqarish emas, aniq savolga javob beradigan qiymatni ko’ring. Masalan, hisoblashdan oldin va keyin jami qiymatini chiqaring. Bu qaysi qadamda qiymat kutilmagandek bo’lganini ko’rsatadi. Ish tugagach vaqtinchalik loglarni olib tashlang yoki ular ishlab chiqarish muhitida maxfiy ma’lumotni chiqarmasligiga ishonch hosil qiling. Email, parol, token va session qiymatini logga yozish xavfsizlik xatosi bo’lishi mumkin.
Minimal takrorlanuvchi misol
Katta loyihada xatoni topish qiyin tuyulishi mumkin. Shunda ishlamaydigan holatni imkon qadar kichraytiring. Masalan, yuz qatorli forma o’rniga bitta input va bitta hisoblash qatorini qoldiring. Xato yo’qolsa, olib tashlangan qismlardan birini sekin qaytaring. Xato qaytgan paytda sabab doirasi torayadi.
Bu usul yordam so’raganda ham foydali. “Kalkulyator ishlamayapti” deyish o’rniga, “12 va 8 kiritilganda 20 emas, 128 chiqyapti; mana shu besh qator kod” deb yozsangiz, muammoni boshqalar ham tekshira oladi.
Debugger va breakpoint
print tezkor bo’lsa-da, ba’zan dastur juda tez ishlaydi yoki sikl ko’p marta aylanadi. IDE va brauzer DevTools’dagi breakpoint kodni tanlangan qatorda vaqtincha to’xtatadi. To’xtagan paytda o’zgaruvchilar qiymatini, qaysi funksiya chaqirilganini va keyingi qadamni ko’rish mumkin. Avval taxmin qiling: noto’g’ri qiymat shu funksiyaga kirishdan oldin paydo bo’ldimi yoki keyin? Keyin shu chegaraga breakpoint qo’ying.
Tuzatishdan keyingi tekshiruv
Bir xatoni tuzatish boshqa holatni buzishi mumkin. Shu sabab har tuzatishdan keyin kamida uch turdagi sinov qiling: muammoni keltirib chiqargan aniq holat, odatiy holat va chekka holat. Xarajatlar misolida musbat summa, bo’sh ro’yxat va manfiy yoki matn ko’rinishidagi summa tekshiriladi. Bu qoida keyinchalik avtomatik test yozishning ham asosi bo’ladi.
Sababni toraytirish
Muammoni qatlamlarga ajratish
Xato ko’ringan joy uning sababi bo’lishi shart emas. Web sahifada tugma ishlamasa, HTML elementi topilmagan, CSS ustiga boshqa qoida kelgan, JavaScript hodisasi ulanmagan, Network so’rovi xato bergan yoki server noto’g’ri javob qaytargan bo’lishi mumkin. Terminal dasturida esa kirish qiymati, funksiya qoidasi, fayl yo’li yoki muhit sozlamasi tekshiriladi. Avval qaysi qatlamda muammo borligini aniqlash keraksiz kodni o’zgartirishdan saqlaydi.
Masalan, foydalanuvchi “saqlash tugmasi ishlamaydi” desa, quyidagicha ketma-ket tekshiring: tugma bosilganda hodisa ishladimi, kiritish qiymati o’qildimi, so’rov yuborildimi, server qaysi kod bilan javob berdi, ma’lumot bazada paydo bo’ldimi, interfeys yangi holatni chizdimi? Har savolga dalil — Console yozuvi, Network javobi, test yoki log bilan javob bering.
Regressiya nima?
Regressiya — yangi o’zgarish avval ishlagan funksiyani buzib qo’ygan holat. Masalan, validatsiya qo’shgach mavjud foydalanuvchi formasini yubora olmasa, yangi kod boshqa holatga salbiy ta’sir qilgan. Buni kamaytirish uchun har tuzatishdan keyin muammo misoli bilan birga asosiy odatiy oqimni ham sinang. Testlar avtomatik bo’lsa, bir xil tekshiruv har o’zgarishda takrorlanadi.
Taxminlarni qayd qilish
Debuggingda “ehtimol mana shu” deb o’ylash normal, ammo uni fakt bilan
aralashtirmang. Taxmin yozing, tekshirish usulini belgilang va natijani qayd
eting. Masalan: “summa matn bo’lib kelmoqda; typeof yoki print bilan
tekshiraman”. Natija noto’g’ri chiqsa, keyingi taxminni shu dalilga asoslang.
Bu usul bir xil faylni qayta-qayta tasodifiy tahrir qilishdan ancha tez.
Debugging mashqi
Xarajatlar dasturida "12" + "8" natijasi "128" bo’lib chiqdi, deylik.
Kutilgan natija 20. Avval qiymat turi nima ekanini chiqaring, keyin qayerda
matn songa aylanishini belgilang, so’ng 12, 8, bo’sh qiymat va abc
misollarini sinang. Tuzatishdan keyin manfiy son va katta son bilan ham test
qiling. Shu mashq sintaksis xatosi emas, ma’lumot turi sababli mantiqiy xatoni
dalil bilan topishga o’rgatadi.
O’zgarishni xavfsiz kichraytirish
Xato chiqqanda butun funksiyani qayta yozish jozibali tuyuladi, ammo bunday yo’l sababni ham, yangi xatoni ham yashirishi mumkin. Avval muammoni tug’dirgan eng kichik o’zgarishni qiling. Masalan, hisob noto’g’ri bo’lsa, avval faqat son turiga aylantirish qatorini o’zgartiring; bir vaqtning o’zida dizayn, nomlar va algoritmni almashtirmang. Kichik o’zgarishdan keyin test qilish oson: natija yaxshilansa, qaysi tuzatish foyda bergani ma’lum bo’ladi.
Git bu yerda yordam beradi. Ish boshlashdan oldin holatni ko’ring, mantiqan bitta muammoga tegishli o’zgarishlarni bir guruhda saqlang va aniq xabar bilan commit qiling. Agar kutilmagan oqibat chiqsa, oldingi holat va o’zgarish farqini solishtirish mumkin. Lekin Git xatoni o’zi topmaydi: avval muammoni takrorlash va kutilgan natijani yozish baribir sizning vazifangiz.
Vaqtinchalik yechim va asl sabab
Ba’zan foydalanuvchiga tez yordam berish uchun vaqtinchalik yechim kerak bo’ladi: masalan, xato xabari o’rniga qayta urinish tugmasini ko’rsatish. Bu foydali, lekin uni asl tuzatish deb hisoblamang. Qayta urinish ishlasa ham, tarmoq nega uzildi yoki server nega noto’g’ri javob berdi, tekshirish kerak. “Alomat yo’qoldi” va “sabab bartaraf etildi” ikki xil natija ekanini ajrating.
Shaxsiy debugging odati
Har muammo uchun qisqa tartibni takrorlang: bir nafas to’xtang, xabarni o’qing, kutilgan natijani yozing, minimal misol tuzing, bitta taxminni sinang va uchta holatda qayta tekshiring. Dastlab bu sekin ko’rinadi. Bir necha mashqdan keyin esa tasodifiy tahrirlar kamayadi, xatolar tezroq topiladi va o’zingiz ham kodga ishonch bilan o’zgartirish kiritasiz.
Xato haqida xabar berish
Foydalanuvchiga ko’rsatiladigan xabar
Dasturchi uchun batafsil log, foydalanuvchi uchun esa sodda va xavfsiz xabar
kerak. Database connection refused yoki stack trace ichki tafsilotni oshkor
qilishi mumkin. Foydalanuvchiga “Hozir saqlab bo’lmadi, qayta urinib ko’ring”
deyish, logga esa request identifikatori va xavfsiz kontekstni yozish to’g’ri.
Maxfiy ma’lumot, token, parol va sessionni xabarda ham, logda ham bermang.
Yordam so’raganda nima yozish kerak
Jamoada yoki yordam so’raganda xabarni tekshirsa bo’ladigan ko’rinishda bering. Foydali hisobot quyidagilarni o’z ichiga oladi:
- Nima qilindi: qaysi sahifa, tugma yoki buyruq ishlatildi.
- Nima kutilgandi: aniq natija yoki holat.
- Aslida nima bo’ldi: xato matni, noto’g’ri natija yoki skrinshot tavsifi.
- Qanday muhitda: brauzer, qurilma, dastur versiyasi yoki buyruq.
- Qanday sinovlar o’tkazildi: qaysi kirishlar bilan takrorlandi.
Masalan, “Forma xato” o’rniga “Chrome’da profil formasiga ali@example.com yozib yuborganda, Network 400 qaytadi; bo’sh emailda esa kutilgan validatsiya chiqadi” deb yozing. Bunda boshqa odam muammoni qayta yaratish uchun yetarli dalil oladi. Parol, shaxsiy ma’lumot va tokenni esa namunadan olib tashlang.
Xulosa
Muammoni takrorlash, uni kichraytirish va oraliq qiymatni tekshirish taxmin o’rniga dalil beradi.
Keyingi darsda birinchi mini-loyiha — o’zgaruvchi, shart, sikl, funksiya va debuggingni bitta ishda birlashtiramiz.