檢索和儲存緊急堆疊追蹤
當Go 程式中發生緊急情況時,提供有價值的偵錯資訊的堆疊追蹤會自動列印到標準輸出。然而,當從恐慌中恢復時,recover() 只傳回一個錯誤字串,指示恐慌的原因。
這提出了是否可以儲存列印的堆疊追蹤以進行進一步分析的問題。
解決方案:利用運行時/調試包
為了解決這個問題,我們可以利用運行時/調試包。透過將程式碼包裝在呼叫recover()的延遲函數中,我們可以捕獲恐慌並使用debug.Stack()存取堆疊追蹤。
以下是展示此方法的範例程式碼片段:
package main import ( "fmt" "runtime/debug" ) func main() { defer func() { if r := recover(); r != nil { fmt.Println("stacktrace from panic: \n" + string(debug.Stack())) } }() var mySlice []int j := mySlice[0] fmt.Printf("Hello, playground %d", j) }
執行時,此程式碼會在發生恐慌時輸出以下堆疊追蹤:
stacktrace from panic: goroutine 1 [running]: runtime/debug.Stack(0x1042ff18, 0x98b2, 0xf0ba0, 0x17d048) /usr/local/go/src/runtime/debug/stack.go:24 +0xc0 main.main.func1() /tmp/sandbox973508195/main.go:11 +0x60 panic(0xf0ba0, 0x17d048) /usr/local/go/src/runtime/panic.go:502 +0x2c0 main.main() /tmp/sandbox973508195/main.go:16 +0x60
此堆疊追蹤提供了導致恐慌的函數呼叫鏈的詳細視圖,使其更容易找出錯誤的根源。
以上是如何在 Go 中捕獲並存儲緊急情況的堆疊追蹤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!