在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 >

然后可以增强框架以返回函数名称,文件,行号等。如何提取信息可以在Framehttps://github.com/pkg/errors/blob/master/stack.go#L23

的不同私有函数中看到。 >

我已经在本地错误包中进行了相同的操作,以便能够调整堆栈的打印方式。可以在Format的{​​{1}}函数中进行调整。

注意:也许不是最简单的解决方案,因为这会使您接触到一些底层的内容,但是与解析已打印的堆栈相比,我更愿意随时使用它。