微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在Go中将追溯堆栈拆分为结构

如何解决在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}}函数中进行调整。

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。