Stack Traces and Debugging
Stack trace'lar va debugging
Xato yuz berganda, "qaysi funksiya qaysi funksiyani chaqirgani" haqidagi ma'lumot — stack trace (chaqiruvlar zanjiri) — debugging uchun juda qimmatli. Go'ning runtime paketi buni dasturiy ravishda o'qish imkonini beradi.
pc, _, _, ok := runtime.Caller(0) // 0 — joriy funksiya
if ok {
fn := runtime.FuncForPC(pc)
fmt.Println(fn.Name()) // masalan, "main.doWork"
}runtime.Caller(skip) chaqiruvlar zanjirida skip qadar yuqoriga ko'tarilib, o'sha darajadagi funksiya haqidagi ma'lumotni qaytaradi (skip=0 — joriy funksiya, skip=1 — uni chaqirgan funksiya, va hokazo). runtime.FuncForPC(pc).Name() esa funksiyaning to'liq nomini (paket bilan birga) qaytaradi. skipni oshirib borib, butun chaqiruvlar zanjirini — soddalashtirilgan stack trace'ni — qo'lda yig'ish mumkin.
>_ Exercise
StackTrace(maxDepth int) []string funksiyasini yozing. U 0dan maxDepth-1gacha bo'lgan har bir skip qiymati uchun runtime.Caller(skip) chaqiradi; agar ok — false bo'lsa, tsiklni to'xtating; aks holda runtime.FuncForPC(pc).Name()ni natijalar slice'iga qo'shing. Yig'ilgan funksiya nomlari slice'ini qaytaring.
Stuck? Reveal a hint to help you.
Key Takeaway
Key Takeaway:
runtime.Caller va runtime.FuncForPC yordamida chaqiruvlar zanjirini dasturiy ravishda o'qish mumkin — bu maxsus logging, xatolarni boyitish (masalan, xato qaysi funksiyada yuz berganini yozib qo'yish) va debugging vositalarini yozishning asosi.
NEXT UP
Error Handling Basics
$ go run main.go
Kodingizni ishga tushiring