问题描述
我正在寻找一种写方法以在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 >
然后可以增强框架以返回函数名称,文件,行号等。如何提取信息可以在Frame
:https://github.com/pkg/errors/blob/master/stack.go#L23
我已经在本地错误包中进行了相同的操作,以便能够调整堆栈的打印方式。可以在Format
的{{1}}函数中进行调整。
注意:也许不是最简单的解决方案,因为这会使您接触到一些底层的内容,但是与解析已打印的堆栈相比,我更愿意随时使用它。