我有一个应用程序,其中主围棋例程生成更多的围棋例程。是否有可能记录任何崩溃的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
第一个堆栈跟踪是foo
从debug.Stack
获得的。第二种是未恢复的panic
使进程崩溃的结果。
可以在recover
中调用debug.Stack
。如何获取panic的堆栈跟踪(并将其存储为变量)