Golang捕獲panic堆棧信息的講解
golang當(dāng)中panic的時候如果啟動的goroutine比較多,刷的信息滿屏都是,在終端工具上因為刷的信息太多,找不到前邊的信息,因此很有必要程序自己捕獲panic,并且將錯誤信息輸出到文件當(dāng)中,以便定位排查問題。
Golang捕獲panic堆棧信息
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打印的堆棧信息更精準(zhǔn),第一行就是發(fā)生panic的代碼行
- 比直接放任其panic打印的堆棧信息更簡潔,可以指定信息量(kb)
最后注意,如果是啟動的多goroutine,需要在每個goroutine執(zhí)行函數(shù)的時候,寫上defer PanicHandler() 否則的話是捕獲不到其他goroutine當(dāng)中的painc信息的。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接
相關(guān)文章
使用golang腳本基于kubeadm創(chuàng)建新的token(問題分析)
這篇文章主要介紹了使用golang腳本基于kubeadm創(chuàng)建新的token(問題分析),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-10-10
Golang實現(xiàn)四種負(fù)載均衡的算法(隨機(jī),輪詢等)
本文介紹了示例介紹了Golang 負(fù)載均衡的四種實現(xiàn),主要包括了隨機(jī),輪詢,加權(quán)輪詢負(fù)載,一致性hash,感興趣的小伙伴們可以參考一下2021-06-06
使用Go語言實現(xiàn)跨域資源共享(CORS)設(shè)置
在Web開發(fā)中,跨域資源共享(CORS)是一種重要的安全機(jī)制,它允許許多資源在一個網(wǎng)頁上被另一個來源的網(wǎng)頁所訪問,然而,出于安全考慮,瀏覽器默認(rèn)禁止這種跨域訪問,為了解決這個問題,我們可以使用Go語言來設(shè)置CORS,需要的朋友可以參考下2024-06-06
Go語言并發(fā)控制之sync.WaitGroup使用詳解
這篇文章主要為大家詳細(xì)介紹了Go語言并發(fā)控制中sync.Map的原理與使用,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-02-02

