将堆栈跟踪放入字符串变量

时间:2015-02-25 06:14:00

标签: go

是否可以像这样放置堆栈跟踪......

goroutine 20 [running]:
runtime.panic(0x3a2820, 0xc2081ad4b0)
    /usr/local/go/src/pkg/runtime/panic.c:279 +0xf5
testing.func·006()
    /usr/local/go/src/pkg/testing/testing.go:416 +0x176
runtime.panic(0x3a2820, 0xc2081ad4b0)
    /usr/local/go/src/pkg/runtime/panic.c:248 +0x18d
my.Test(0x3a2820, 0xc2081acf20, 0x3a2820, 0xc2081acf30, 0xc208056000)
    /Users/usr/golang/src/my/testing.go:67 +0x572

...在字符串变量中,用于重新格式化并为我切断冗余信息。

这个伪代码就像这样:

package main

import (
    "runtime"
)

func main() {
    var stackStr string
    stackStr = runtime.GetStackFromHere()
}

我尝试了panic("give me stack trace from here"),但是它不会在var string中打印堆栈跟踪,而只会打印到控制台。

1 个答案:

答案 0 :(得分:7)

使用runtime.Stack函数获取堆栈跟踪:

b := make([]byte, 2048) // adjust buffer size to be larger than expected stack
n := runtime.Stack(b, false)
s := string(b[:n])

另一种方法是在循环中调用runtime.Caller并将堆栈跟踪格式化为缓冲区。