用golang系统包中的处理方法获取goroutine的调用栈
来源:互联网 发布:淘宝卖鞋子的好店 编辑:程序博客网 时间:2024/06/02 11:21
当golang业务模块发生异常的时候,我们常常需要获取其调用栈来确定发生异常的位置。这里来看看golang系统包中的net/http包(基于1.9版本)中是如何获取goroutine的调用栈的。其源代码如下:
// Serve a new connection.func (c *conn) serve(ctx context.Context) { c.remoteAddr = c.rwc.RemoteAddr().String() ctx = context.WithValue(ctx, LocalAddrContextKey, c.rwc.LocalAddr()) defer func() { if err := recover(); err != nil && err != ErrAbortHandler { const size = 64 << 10 buf := make([]byte, size) buf = buf[:runtime.Stack(buf, false)] c.server.logf("http: panic serving %v: %v\n%s", c.remoteAddr, err, buf) } if !c.hijacked() { c.close() c.setState(c.rwc, StateClosed) } }() ...}
可以看出,获取goroutine调用栈的正确状态为:
const size = 64 << 10 buf := make([]byte, size) buf = buf[:runtime.Stack(buf, false)]
buf中存放的就是当前goroutine的调用栈。如果想获取所有goroutine的调用栈,那么把runtime.Stack方法中第二个参数改为true即可。
推荐在所有的接口处都要加上异常处理,并且将调用栈存储起来。虽然可能会稍微牺牲一点点性能。但是服务最重要的参数是业务的正确性和可靠性,在这个基础上再追求高性能。
阅读全文
0 0
- 用golang系统包中的处理方法获取goroutine的调用栈
- Golang获取goroutine ID
- 对于golang的goroutine并发处理任务时的理解
- golang 包中的init调用
- golang的goroutine调度机制
- golang 阻止主goroutine退出方法
- 个人对于golang的goroutine并发处理任务时的理解
- Golang goroutine协程(一) 编写第一个并发处理的程序
- [Golang]一个非典型的GoRoutine的错误
- golang的goroutine是如何实现的
- golang 里goroutine产生的线程数量
- golang-goroutine与channel:高效的channel
- 关于 Golang 限制goroutine的数量
- golang-goroutine与channel:高效的channel
- Golang regexp包中的函数和方法
- golang中的RPC调用服务器方法
- goroutine背后的系统知识
- goroutine背后的系统知识
- datepicker日期插件位置出现错误
- Neutron 理解(14):Neutron ML2 + Linux bridge + VxLAN 组网
- 2017安卓开发接入支付宝支付功能详解,真正做到完全翻译支付宝sdk开发应用
- 200. Number of Islands
- 关于二叉树遍历的快捷思考方法
- 用golang系统包中的处理方法获取goroutine的调用栈
- 省市二级联动
- URL中编码URL特殊字符
- centos 6安装zabbix agent
- 没有拿得出手的项目, 如何在面试/简历中为自己加分?
- 先验分布,后验分布,共轭分布的关系
- Linux:RPM 打包记录
- 注解+aop/拦截器实现防重复点击、机刷
- C# 文件夹的操作之选择文件夹对话框