Golang:程序崩溃时如何跟踪单个例程的堆栈信息

3
我想知道,是否有一种方法可以让我的go应用程序仅输出发生panic(随后死机)的例程的堆栈跟踪,而不是所有的goroutine,因为它们很多。
我认为可以通过传递某种标志给go run或go build来实现这一点,但似乎找不到相应的内容。
任何帮助都将不胜感激。

我不知道有任何标志来控制这个。由于出现 panic 的 goroutine(应该)是第一个,所以很容易只需丢弃或忽略其余的部分,对吗? - Volker
我现在无法写出完整的答案,但是您应该能够通过恢复、打印您的堆栈并再次触发异常来解决这个问题。 - thwd
@Tom 的意思是,你应该在主函数中加入 panic catch,这样任何 panic 都会被它捕获。 - joshlf
自Go 1.6以来,这是默认设置。 - Graham King
1个回答

0

我建议(未经测试)在延迟函数中使用runtime.Stack,同时修改(用于调试目的)您现有的代码以进行调试:

const debug = true //TODO turn off for production

func MyPotentiallyPanickingGoroutine() {
        if debug {
            buf := make([]byte, 1<<16)
            defer func() {
                    fmt.Printf("%s\n", runtime.Stack(buf, false))
            }()
        }

        // existing code follows
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接