runtime.Stack
- Go kursu
- Uzman
- Ders 22/34
- 4 dk
Stack ile bir goroutine'in yığın izini almayı öğrenirsin.
runtime.Stack
runtime.Stack(buf, all) çağrı yığınını metin olarak tampona yazar. all true ise tüm goroutine'lerin yığınları yazılır; takılan bir servisi teşhis ederken çok değerlidir.
buf := make([]byte, 1<<16)
n := runtime.Stack(buf, true)
os.Stderr.Write(buf[:n])Yalnızca mevcut goroutine için debug.Stack() ya da debug.PrintStack() daha kısadır.
runtime.Caller
runtime.Caller(skip) çağıranın dosya adını ve satırını döndürür; log kütüphaneleri satır bilgisini böyle ekler:
func nerede() string {
_, dosya, satir, ok := runtime.Caller(1)
if !ok { return "?" }
return fmt.Sprintf("%s:%d", filepath.Base(dosya), satir)
}skip=0 Caller'ı çağıran fonksiyonu, 1 onun çağıranını gösterir.
Uygulama Yığında ara
calisan() adlı bir fonksiyon yaz; içinde buf := make([]byte, 4096) ile runtime.Stack(buf, false) çağırsın ve yığın metninin "main.calisan" içerip içermediğini strings.Contains ile döndürsün. Sonucu yazdır.
Başlangıç kodu
package main
import (
"fmt"
"runtime"
"strings"
)
func main() {
// buraya yaz
}Örnek çözüm
package main
import (
"fmt"
"runtime"
"strings"
)
func calisan() bool {
buf := make([]byte, 4096)
n := runtime.Stack(buf, false)
return strings.Contains(string(buf[:n]), "main.calisan")
}
func main() {
fmt.Println(calisan())
}Beklenen çıktı
true
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Çalışan bir Go sürecinin tüm goroutine yığınlarını kod değiştirmeden nasıl alırsın?
- GOGC=off ile
- Mümkün değildir
- SIGQUIT göndererek (Ctrl+\) Doğru cevap
- SIGINT göndererek
Açıklama: Go çalışma zamanı SIGQUIT alınca tüm goroutine yığınlarını stderr'e yazar ve çıkar; GOTRACEBACK=all ayrıntıyı artırır.
2 Tüm goroutine'ler
n := runtime.Stack(buf, ____)
n := runtime.Stack(buf, true)
Açıklama: İkinci argüman true olunca tüm goroutine'lerin yığını yazılır.
3 Araç ve çıktı
| Kavram | Anlamı |
|---|---|
runtime.Stack(buf, true) |
Tüm yığınlar |
debug.Stack() |
Mevcut goroutine |
runtime.Caller(1) |
Dosya ve satır |
SIGQUIT |
Yığın dökümü ve çıkış |