golang當(dāng)中panic的時(shí)候如果啟動(dòng)的goroutine比較多,刷的信息滿(mǎn)屏都是,在終端工具上因?yàn)樗⒌男畔⑻?,找不到前邊的信息,因此很有必要程序自己捕獲panic,并且將錯(cuò)誤信息輸出到文件當(dāng)中,以便定位排查問(wèn)題。
func PanicTrace(kb int) []byte {
s := []byte("/src/runtime/panic.go")
e := []byte("\ngoroutine ")
line := []byte("\n")
stack := make([]byte, kb10) //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
}
最后注意,如果是啟動(dòng)的多goroutine,需要在每個(gè)goroutine執(zhí)行函數(shù)的時(shí)候,寫(xiě)上defer PanicHandler() 否則的話(huà)是捕獲不到其他goroutine當(dāng)中的painc信息的。
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接