パニックのスタックトレースの取得と保存
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 サイトの他の関連記事を参照してください。