dro59505 2018-08-30 18:18
浏览 32
已采纳

如何获取紧急情况的堆栈跟踪(并存储为变量)

As we all know, panics produce a stacktrace to stdout (Playground link).:

panic: runtime error: index out of range
goroutine 1 [running]:
main.main()
    /tmp/sandbox579134920/main.go:9 +0x20

And it seems when you recover from a panic, recover() returns only an error which describes what caused the panic (Playground link).

runtime error: index out of range

My question is, is it possible to store the stacktrace which is written to stdout? This provides much better debugging information than the string runtime error: index out of range because it shows the exact line in a file which caused the panic.

  • 写回答

2条回答 默认 最新

  • duai1683 2018-08-30 22:51
    关注

    Like @Volker mentioned above, and what was posted as a comment, we can use the runtime/debug package.

    package main
    
    import (
        "fmt"
        "runtime/debug"
    )
    
    func main() {
        defer func() {
            if r := recover(); r != nil {
                fmt.Println("stacktrace from panic: 
    " + string(debug.Stack()))
            }
        }()
    
        var mySlice []int
        j := mySlice[0]
    
        fmt.Printf("Hello, playground %d", j)
    }
    

    prints

    stacktrace from panic: 
    goroutine 1 [running]:
    runtime/debug.Stack(0x1042ff18, 0x98b2, 0xf0ba0, 0x17d048)
        /usr/local/go/src/runtime/debug/stack.go:24 +0xc0
    main.main.func1()
        /tmp/sandbox973508195/main.go:11 +0x60
    panic(0xf0ba0, 0x17d048)
        /usr/local/go/src/runtime/panic.go:502 +0x2c0
    main.main()
        /tmp/sandbox973508195/main.go:16 +0x60
    

    Playground link.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料