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

标签 go logging stack traceback

我正在寻找一种在golang中记录回溯堆栈的方法,但只有其中的一些行。正如我所看到的,它可以通过将从 debug.Stack() 获得的结果拆分为一个结构 slice 来完成,然后可以轻松地对其进行解析。
这就是我现在通过调用“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 的不同私有(private)函数中看到。 : https://github.com/pkg/errors/blob/master/stack.go#L23
我在我们的本地错误包中做了同样的事情,以便能够调整堆栈的打印方式。这可以在 Format 中进行调整Frame 的功能.
注意:可能不是最简单的解决方案,因为这会使您接触到一些低级的东西,但我更喜欢它随时解析已经打印的堆栈。

关于go - 在go中将回溯堆栈拆分为结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63742348/

相关文章:

macos - Golang - 发布基本命令 "vet"和 "godoc"

pointers - 如何在不指定类型的情况下修改函数输入参数?

php - 设计日志系统

list - 检查平衡定界符函数 Haskell

c - Pop in Stack 不弹出?

go - 如何访问包外的模板?

go - 如何传递结构数组,其中包含基本结构Golang中的多态性

ruby-on-rails - Rails4 中的自定义记录器?

跨多个线程的 Java 日志记录

c - 哪些工具可以捕获C中的缓冲区溢出?