golang當中panic的時候如果啟動的goroutine比較多,刷的信息滿屏都是,在終端工具上因為刷的信息太多,找不到前邊的信息,因此很有必要程序自己捕獲panic,并且將錯誤信息輸出到文件當中,以便定位排查問題。
Golang捕獲panic堆棧信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
func PanicTrace(kb int ) []byte { s := []byte( "/src/runtime/panic.go" ) e := []byte( "\ngoroutine " ) line := []byte( "\n" ) stack := make([]byte, kb<<10) //4KB length := runtime.Stack(stack, true ) start := bytes.Index(stack, s) stack = stack[start:length] start = bytes.Index(stack, line) + 1 stack = stack[start:] end := bytes.LastIndex(stack, line) if end != -1 { stack = stack[:end] } end = bytes.Index(stack, e) if end != -1 { stack = stack[:end] } stack = bytes.TrimRight(stack, "\n" ) return stack } |
該函數(shù)的優(yōu)點:
- 比直接recover()捕獲的panic信息更加詳盡
- 比直接放任其panic打印的堆棧信息更精準,第一行就是發(fā)生panic的代碼行
- 比直接放任其panic打印的堆棧信息更簡潔,可以指定信息量(kb)
最后注意,如果是啟動的多goroutine,需要在每個goroutine執(zhí)行函數(shù)的時候,寫上defer PanicHandler() 否則的話是捕獲不到其他goroutine當中的painc信息的。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對服務(wù)器之家的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接
原文鏈接:https://blog.csdn.net/bravezhe/article/details/82353409