Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah saya boleh mendapatkan semula dan menyimpan surih tindanan panik Go untuk penyahpepijatan yang lebih terperinci?

Bagaimanakah saya boleh mendapatkan semula dan menyimpan surih tindanan panik Go untuk penyahpepijatan yang lebih terperinci?

Susan Sarandon
Susan Sarandonasal
2024-11-13 02:23:02879semak imbas

How can I retrieve and store the stacktrace of a Go panic for more detailed debugging?

Mengambil dan Menyimpan Susun Tindanan Panik

Panik dalam Go, secara lalai, mengeluarkan surih tindanan kepada output standard, memberikan maklumat penyahpepijatan yang berharga. Walau bagaimanapun, pemulihan daripada panik menggunakan recover() hanya mengembalikan perihalan ralat.

Adakah terdapat cara untuk mendapatkan dan menyimpan surih tindanan yang dihasilkan semasa panik, menjadikannya lebih mudah untuk mengenal pasti lokasi sebenar isu?

Menggunakan Pakej runtime/debug

Jawapannya terletak pada runtime/debug pakej. Pakej ini menyediakan mekanisme untuk mengakses dan menyimpan surih tindanan yang dikaitkan dengan panik. Begini caranya:

package main

import (
    "fmt"
    "runtime/debug"
)

func main() {
    defer func() {
        if r := recover(); r != nil {
            fmt.Println("Panic detected:", r)
            stacktrace := debug.Stack()
            fmt.Println("Stacktrace:", string(stacktrace))
        }
    }()

    // Trigger a panic
    var mySlice []int
    j := mySlice[0] // Index out of bounds panic

    fmt.Printf("Hello, playground %d", j)
}

Kod ini mentakrifkan fungsi tertunda yang mengendalikan sebarang panik. Apabila panik berlaku, fungsi recover() menangkap ralat. Selain itu, fungsi debug.Stack() digunakan untuk mendapatkan surih tindanan yang dikaitkan dengan panik dan menyimpannya sebagai pembolehubah rentetan. Akhir sekali, kedua-dua ralat dan surih tindanan dicetak ke konsol untuk tujuan penyahpepijatan.

Menjalankan kod ini akan mengeluarkan yang berikut:

Panic detected: runtime error: index out of range
Stacktrace:
goroutine 1 [running]:
main.main.func1()
    /tmp/sandbox773777618/main.go:11 +0x60
panic(0xf9e00, 0x2078e0)
    /usr/local/go/src/runtime/panic.go:502 +0x2c0
main.main()
    /tmp/sandbox773777618/main.go:17 +0x60

Dalam output ini, surih tindanan dengan jelas menunjukkan garisan dalam kod yang menyebabkan panik, memberikan maklumat penyahpepijatan yang lebih berharga daripada hanya penerangan ralat.

Atas ialah kandungan terperinci Bagaimanakah saya boleh mendapatkan semula dan menyimpan surih tindanan panik Go untuk penyahpepijatan yang lebih terperinci?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn