为了账号安全,请及时绑定邮箱和手机立即绑定

在go中将回溯堆栈拆分为结构

在go中将回溯堆栈拆分为结构

Go
哔哔one 2022-06-27 15:54:47
我正在寻找一种在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 +0x9fmain.go_logger(0x4cc235, 0x11, 0x4ccf9d, 0x15, 0xc000090101)        /go/src/ethernet_monitor/info.go:30 +0x290main.temp(...)        /go/src/ethernet_monitor/info.go:40main.main()        /go/src/ethernet_monitor/info.go:45 +0x52这就是我希望它被拆分的方式,类似于 python 的 traceback.extract_stack() 结构:fileName: /go/src/ethernet_monitor/info.gofunction: main.main()lineNumber: 45所以问题是 - 它是否已经以某种方式实施了?我对编写自己的解析函数不是很有信心,因为我可能会错过一些特定的案例。
查看完整描述

1 回答

?
SMILET

TA贡献1796条经验 获得超4个赞

您最好使用runtime.Callers获取单个项目而不是尝试将堆栈解析为字节。

这就是github.com/pkg/errors这里的作用:https ://github.com/pkg/errors/blob/master/stack.go#L163:1 。您可以看到它runtime.Callers已经能够跳过某些级别。

uintptr需要你可以看到,这是相当低的水平。但是,您应该没问题,只需复制callers函数和它所依赖的所有内容,并使用该StackTrace函数来获得更有用的单个Frames 堆栈:https ://github.com/pkg/errors/blob/master/stack.go#L155

然后可以增强框架以返回函数名称、文件、行号等。如何提取这些信息可以在不同的私有函数中看到Framehttps ://github.com/pkg/errors/blob/master/ stack.go#L23

我在我们的本地错误包中做了同样的事情,以便能够调整堆栈的打印方式。这可以在 a 的Format函数中进行调整Frame

注意:可能不是最简单的解决方案,因为这会使您接触到一些低级的东西,但我更喜欢它随时解析已经打印的堆栈。


查看完整回答
反对 回复 2022-06-27
  • 1 回答
  • 0 关注
  • 185 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号