Go語言列印呼叫堆疊
這兩天看Go的代碼,呃,協程太多,無數個攜程調用了一個方法,徹底看不清了,所以就想到是不是可以把呼叫堆疊列印出來。
查了一下,發現Go的 runtime/debug 庫可以把呼叫堆疊打出來。下面看個例子:
package mainimport ( "fmt" "runtime/debug")func test1() { test2()}func test2() { test3()}func test3() { fmt.Printf("%s", debug.Stack()) debug.PrintStack()}func main() { test1()}
從上面代碼可以看出,可以通過 debug.PrintStack() 直接列印,也可以通過 debug.Stack() 方法擷取堆棧然後自己列印。
運行測試
$ go run test_stacktrace.gogoroutine 1 [running]:runtime/debug.Stack(0x0, 0x0, 0x0) /usr/lib/golang/src/runtime/debug/stack.go:24 +0x80main.test3() /tmp/test_stacktrace.go:17 +0x24main.test2() /tmp/test_stacktrace.go:13 +0x14main.test1() /tmp/test_stacktrace.go:9 +0x14main.main() /tmp/test_stacktrace.go:22 +0x14goroutine 1 [running]:runtime/debug.Stack(0x0, 0x0, 0x0) /usr/lib/golang/src/runtime/debug/stack.go:24 +0x80runtime/debug.PrintStack() /usr/lib/golang/src/runtime/debug/stack.go:16 +0x18main.test3() /tmp/test_stacktrace.go:18 +0x101main.test2() /tmp/test_stacktrace.go:13 +0x14main.test1() /tmp/test_stacktrace.go:9 +0x14main.main() /tmp/test_stacktrace.go:22 +0x14