より詳細なデバッグのために Go パニックのスタックトレースを取得して保存するにはどうすればよいですか?

Susan Sarandon
リリース: 2024-11-13 02:23:02
オリジナル
871 人が閲覧しました

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

パニックのスタックトレースの取得と保存

Go のパニックは、デフォルトでスタックトレースを標準出力に出力し、貴重なデバッグ情報を提供します。ただし、recover() を使用してパニックから回復すると、エラーの説明のみが返されます。

問題の正確な場所を特定しやすくするために、パニック中に生成されたスタックトレースを取得して保存する方法はありますか?

ランタイム/デバッグ パッケージの使用

答えはランタイム/デバッグにあります パッケージ。このパッケージは、パニックに関連付けられたスタックトレースにアクセスして保存するメカニズムを提供します。その方法は次のとおりです。

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)
}
ログイン後にコピー

このコードは、パニックを処理する遅延関数を定義します。パニックが発生すると、recover() 関数がエラーをキャプチャします。さらに、debug.Stack() 関数を使用して、パニックに関連付けられたスタックトレースを取得し、それを文字列変数として保存します。最後に、エラーとスタックトレースの両方が、デバッグ目的でコンソールに出力されます。

このコードを実行すると、次のように出力されます。

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
ログイン後にコピー

この出力では、スタックトレースに次の行が明確に表示されます。パニックを引き起こしたコード内で、単なるエラーの説明よりも貴重なデバッグ情報が提供されます。

以上がより詳細なデバッグのために Go パニックのスタックトレースを取得して保存するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート