CodeBlanks Logo Icon CodeBlanks

runtime.Stack

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

main.go
package main

import (
    "fmt"
    "runtime"
    "strings"
)

func main() {
    // buraya yaz
}

Örnek çözüm

main.go
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

Soru
n := runtime.Stack(buf, ____)
Cevap
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ış

Uzman bölümündeki tüm dersler