Golang捕获panic堆栈信息的讲解

 更新时间:2019年04月02日 08:55:15   作者:墨子哲  
今天小编就为大家分享一篇关于Golang捕获panic堆栈信息的讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

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存储基础使用direct io方法实例

    Go存储基础使用direct io方法实例

    这篇文章主要介绍了Go存储基础之如何使用direct io方法实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • 使用golang脚本基于kubeadm创建新的token(问题分析)

    使用golang脚本基于kubeadm创建新的token(问题分析)

    这篇文章主要介绍了使用golang脚本基于kubeadm创建新的token(问题分析),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-10-10
  • Golang实现四种负载均衡的算法(随机,轮询等)

    Golang实现四种负载均衡的算法(随机,轮询等)

    本文介绍了示例介绍了Golang 负载均衡的四种实现,主要包括了随机,轮询,加权轮询负载,一致性hash,感兴趣的小伙伴们可以参考一下
    2021-06-06
  • 使用Go语言实现跨域资源共享(CORS)设置

    使用Go语言实现跨域资源共享(CORS)设置

    在Web开发中,跨域资源共享(CORS)是一种重要的安全机制,它允许许多资源在一个网页上被另一个来源的网页所访问,然而,出于安全考虑,浏览器默认禁止这种跨域访问,为了解决这个问题,我们可以使用Go语言来设置CORS,需要的朋友可以参考下
    2024-06-06
  • Go语言并发控制之sync.WaitGroup使用详解

    Go语言并发控制之sync.WaitGroup使用详解

    这篇文章主要为大家详细介绍了Go语言并发控制中sync.Map的原理与使用,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-02-02
  • go语言中的defer关键字

    go语言中的defer关键字

    这篇文章介绍了go语言中的defer关键字,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • Go中的gRPC入门教程详解

    Go中的gRPC入门教程详解

    本文详细讲解了Go中的gRPC入门教程,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-03-03
  • 一文详细介绍golang中.()类型断言的使用方法

    一文详细介绍golang中.()类型断言的使用方法

    Golang是一门非常流行的编程语言,在很多领域都有着广泛的应用,在开发过程中,很多时候我们需要将函数作为参数传递给其他函数,这时候就需要用到golang中的.()用法,本文将详细介绍golang中.()的使用方法,需要的朋友可以参考下
    2023-08-08
  • 使用Go语言计算字符串编辑距离的代码实现

    使用Go语言计算字符串编辑距离的代码实现

    在自然语言处理、拼写纠错、模糊搜索等场景中,我们经常需要衡量两个字符串之间的相似度,编辑距离(Edit Distance)  就是一个经典的衡量方式,它描述了将一个字符串转换为另一个字符串所需的最少操作次数,本文给大家介绍了如何使用Go语言计算字符串编辑距离
    2025-07-07
  • Go语言中数组的基本用法演示

    Go语言中数组的基本用法演示

    这篇文章主要介绍了Go语言中数组的基本用法演示,包括一个冒泡排序算法的简单实现,需要的朋友可以参考下
    2015-10-10

最新评论