将回溯堆栈拆分为结构
Splitting traceback stack into structure in go
我正在寻找一种方法来在 golang 中记录回溯堆栈,但只有其中的几行。正如我所见,可以通过将从 debug.Stack() 获得的结果拆分为一片结构来完成,然后可以很容易地对其进行解析。
这就是我现在通过调用“fmt.Println(string(debug.Stack()))”得到的结果:
goroutine 1 [running]:
runtime/debug.Stack(0xc0000c0050, 0x2, 0x0)
/go/go1.15rc1/src/runtime/debug/stack.go:24 +0x9f
main.go_logger(0x4cc235, 0x11, 0x4ccf9d, 0x15, 0xc000090101)
/go/src/ethernet_monitor/info.go:30 +0x290
main.temp(...)
/go/src/ethernet_monitor/info.go:40
main.main()
/go/src/ethernet_monitor/info.go:45 +0x52
这就是我希望它被拆分的方式,类似于 python 的 traceback.extract_stack() 结构:
fileName: /go/src/ethernet_monitor/info.go
function: main.main()
lineNumber: 45
所以问题是 - 它是否已经以某种方式实施了?我不太有信心编写自己的解析函数,因为我可能会错过一些特定的情况。
您最好使用 runtime.Callers
来获取单个项目,而不是尝试将堆栈解析为字节。
这就是 github.com/pkg/errors
在这里所做的:https://github.com/pkg/errors/blob/master/stack.go#L163:1。可以看到runtime.Callers
已经可以跳过一些关卡了。
从所需要的uintptr
可以看出,这是相当低级的。但是,您应该只复制 callers
函数及其依赖的所有内容,然后使用 StackTrace
函数来获得更有用的单个 Frame
s 堆栈:https://github.com/pkg/errors/blob/master/stack.go#L155
然后可以将框架增强为 return 函数名称、文件、行号等。如何提取该信息可以在 Frame
的不同私有函数中看到:https://github.com/pkg/errors/blob/master/stack.go#L23
我在我们的本地错误包中做了同样的事情,以便能够调整堆栈的打印方式。这可以在 Frame
.
的 Format
函数中进行调整
注意:这可能不是最简单的解决方案,因为这会让您接触到一些低级的东西,但我更愿意随时使用它来解析已经打印的堆栈。
我正在寻找一种方法来在 golang 中记录回溯堆栈,但只有其中的几行。正如我所见,可以通过将从 debug.Stack() 获得的结果拆分为一片结构来完成,然后可以很容易地对其进行解析。
这就是我现在通过调用“fmt.Println(string(debug.Stack()))”得到的结果:
goroutine 1 [running]:
runtime/debug.Stack(0xc0000c0050, 0x2, 0x0)
/go/go1.15rc1/src/runtime/debug/stack.go:24 +0x9f
main.go_logger(0x4cc235, 0x11, 0x4ccf9d, 0x15, 0xc000090101)
/go/src/ethernet_monitor/info.go:30 +0x290
main.temp(...)
/go/src/ethernet_monitor/info.go:40
main.main()
/go/src/ethernet_monitor/info.go:45 +0x52
这就是我希望它被拆分的方式,类似于 python 的 traceback.extract_stack() 结构:
fileName: /go/src/ethernet_monitor/info.go
function: main.main()
lineNumber: 45
所以问题是 - 它是否已经以某种方式实施了?我不太有信心编写自己的解析函数,因为我可能会错过一些特定的情况。
您最好使用 runtime.Callers
来获取单个项目,而不是尝试将堆栈解析为字节。
这就是 github.com/pkg/errors
在这里所做的:https://github.com/pkg/errors/blob/master/stack.go#L163:1。可以看到runtime.Callers
已经可以跳过一些关卡了。
从所需要的uintptr
可以看出,这是相当低级的。但是,您应该只复制 callers
函数及其依赖的所有内容,然后使用 StackTrace
函数来获得更有用的单个 Frame
s 堆栈:https://github.com/pkg/errors/blob/master/stack.go#L155
然后可以将框架增强为 return 函数名称、文件、行号等。如何提取该信息可以在 Frame
的不同私有函数中看到:https://github.com/pkg/errors/blob/master/stack.go#L23
我在我们的本地错误包中做了同样的事情,以便能够调整堆栈的打印方式。这可以在 Frame
.
Format
函数中进行调整
注意:这可能不是最简单的解决方案,因为这会让您接触到一些低级的东西,但我更愿意随时使用它来解析已经打印的堆栈。