欢迎来到代码驿站!

Golang

当前位置:首页 > 脚本语言 > Golang

Golang捕获panic堆栈信息的讲解

时间:2021-03-25 09:18:44|栏目:Golang|点击:

golang当中panic的时候如果启动的goroutine比较多,刷的信息满屏都是,在终端工具上因为刷的信息太多,找不到前边的信息,因此很有必要程序自己捕获panic,并且将错误信息输出到文件当中,以便定位排查问题。

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
}

该函数的优点:

  • 比直接recover()捕获的panic信息更加详尽
  • 比直接放任其panic打印的堆栈信息更精准,第一行就是发生panic的代码行
  • 比直接放任其panic打印的堆栈信息更简洁,可以指定信息量(kb)

最后注意,如果是启动的多goroutine,需要在每个goroutine执行函数的时候,写上defer PanicHandler() 否则的话是捕获不到其他goroutine当中的painc信息的。

总结

上一篇:go语言中的Carbon库时间处理技巧

栏    目:Golang

下一篇:GO语言标准错误处理机制error用法实例

本文标题:Golang捕获panic堆栈信息的讲解

本文地址:http://www.codeinn.net/misctech/87617.html

推荐教程

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:914707363 | 邮箱:codeinn#126.com(#换成@)

Copyright © 2020 代码驿站 版权所有