记录任何go例程的堆栈跟踪



我有一个应用程序,其中主围棋例程生成更多的围棋例程。是否有可能记录任何崩溃的go例程的堆栈跟踪?使用"defer debug.Stack()"one_answers"恢复()";在main中,按预期打印main例程的堆栈跟踪。是否有任何方法可以打印生成的go例程的堆栈跟踪,如果它们panic ?

如果一个程序是panic,它的堆栈跟踪将被显示。

如果一个线程正在调用debug.Stack,它的(调用线程的)堆栈跟踪将被提供。

运行这个例子来演示两者:

package main
import (
"fmt"
"runtime/debug"
"time"
)
func foo() {
stack := debug.Stack()
fmt.Println("foo's stack:", string(stack))
panic("oh noes")
}
func worker() {
foo()
}
func main() {
go foo()
time.Sleep(200 * time.Millisecond)
}

你会看到这样的内容:

foo's stack: goroutine 6 [running]:
runtime/debug.Stack(0x0, 0x0, 0x0)
/usr/local/go/src/runtime/debug/stack.go:24 +0x9f
main.foo()
/tmp/gogo.go:10 +0x26
created by main.main
/tmp/gogo.go:21 +0x35
panic: oh noes
goroutine 6 [running]:
main.foo()
/tmp/gogo.go:13 +0xe6
created by main.main
/tmp/gogo.go:21 +0x35
exit status 2

第一个堆栈跟踪是foodebug.Stack获得的。第二种是未恢复的panic使进程崩溃的结果。

可以在recover中调用debug.Stack。如何获取panic的堆栈跟踪(并将其存储为变量)

最新更新