用golang系统包中的处理方法获取goroutine的调用栈
2017-09-19 15:15
260 查看
当golang业务模块发生异常的时候,我们常常需要获取其调用栈来确定发生异常的位置。这里来看看golang系统包中的net/http包(基于1.9版本)中是如何获取goroutine的调用栈的。其源代码如下:
可以看出,获取goroutine调用栈的正确状态为:
buf中存放的就是当前goroutine的调用栈。如果想获取所有goroutine的调用栈,那么把runtime.Stack方法中第二个参数改为true即可。
推荐在所有的接口处都要加上异常处理,并且将调用栈存储起来。虽然可能会稍微牺牲一点点性能。但是服务最重要的参数是业务的正确性和可靠性,在这个基础上再追求高性能。
// 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即可。
推荐在所有的接口处都要加上异常处理,并且将调用栈存储起来。虽然可能会稍微牺牲一点点性能。但是服务最重要的参数是业务的正确性和可靠性,在这个基础上再追求高性能。
相关文章推荐
- 批处理bat标准化获取当前系统日期的几种方法
- 获取系统当前时间时带有星期的处理方法
- Linux系统常见紧急情况的处理方法
- 安装SQL SERVER 2000时提示"系统有挂起的程序"?的处理方法
- web程序中获取应用程序系统变量的方法( For.net 1.1)
- Domino系统中B/S下附件链接的处理方法
- Asp.Net 2.0 中错误处理的几种方法(发邮件及记录信息到系统事件中)
- 用Request方法从页面得到Html内容时的处理 及 iframe中控件内容的获取
- 获取系统不识别的内存方法:mmap
- Domino系统中B/S下附件链接的处理方法
- 用VC++获取系统时间几种方法
- Java中获取本地系统时间的方法
- IMAIL系统修改IP地址的处理方法
- 另一种获取系统服务描述表入口地址的方法
- 转载:Linux系统下6个常见紧急情况的应急处理方法
- 系统不认U盘的几种处理方法
- [译]获取系统网络MAC地址的三种方法
- RS-485系统的常见故障及处理方法
- mssql数据库系统崩溃后的一般处理步骤与方法
- [转帖]Domino系统中B-S下附件链接的处理方法