亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何獲取恐慌的堆棧跟蹤(并存儲為變量)

如何獲取恐慌的堆棧跟蹤(并存儲為變量)

Go
慕田峪4524236 2023-03-29 15:22:02
眾所周知,恐慌會產生一個堆棧跟蹤到標準輸出(Playground 鏈接):panic: runtime error: index out of rangegoroutine 1 [running]:main.main()    /tmp/sandbox579134920/main.go:9 +0x20似乎當您從恐慌中恢復過來時,recover()只會返回一個error描述導致恐慌的原因(Playground 鏈接)。runtime error: index out of range我的問題是,是否可以存儲寫入標準輸出的堆棧跟蹤?這提供了比字符串更好的調試信息,runtime error: index out of range因為它顯示了文件中導致恐慌的確切行。
查看完整描述

3 回答

?
繁星淼淼

TA貢獻1775條經驗 獲得超11個贊

我們可以使用該runtime/debug包。


package main


import (

? ? "fmt"

? ? "runtime/debug"

)


func main() {

? ? defer func() {

? ? ? ? if r := recover(); r != nil {

? ? ? ? ? ? fmt.Println("stacktrace from panic: \n" + string(debug.Stack()))

? ? ? ? }

? ? }()


? ? var mySlice []int

? ? j := mySlice[0]


? ? fmt.Printf("Hello, playground %d", j)

}

印刷


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


查看完整回答
反對 回復 2023-03-29
?
HUX布斯

TA貢獻1876條經驗 獲得超6個贊

創建一個日志文件以將堆棧跟蹤添加到 stdout 或 stderr 的文件中。這將在文件中添加包括時間和錯誤行的數據。


package main


import (

    "log"

    "os"

    "runtime/debug"

)


func main() {


    defer func() {

        if r := recover(); r != nil {

            log.Println(string(debug.Stack()))

        }

    }()


    //create your file with desired read/write permissions

    f, err := os.OpenFile("filename", os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0644)

    if err != nil {

        log.Println(err)

    }


    //set output of logs to f

    log.SetOutput(f)

    var mySlice []int

    j := mySlice[0]


    log.Println("Hello, playground %d", j)


    //defer to close when you're done with it, not because you think it's idiomatic!

    f.Close()

}

Go 操場上的工作示例



查看完整回答
反對 回復 2023-03-29
?
侃侃爾雅

TA貢獻1801條經驗 獲得超16個贊

這是將恐慌轉換為錯誤的解決方案,堆棧跟蹤將像任何其他錯誤一樣被記錄


package main


import (

    "fmt"


    "github.com/pkg/errors"

)


func wrong() int {

    var mySlice []int

    return mySlice[0]

}


func main() {

    defer func() {

        if r := recover(); r != nil {

            fmt.Printf("Error: %+v", errors.New(fmt.Sprintf("%v", r)))

        }

    }()


    fmt.Printf("Hello, playground %d", wrong())

}

去游樂場輸出


Error: runtime error: index out of range [0] with length 0

main.main.func1

    /tmp/sandbox2058999152/prog.go:17

runtime.gopanic

    /usr/local/go-faketime/src/runtime/panic.go:884

runtime.goPanicIndex

    /usr/local/go-faketime/src/runtime/panic.go:113

main.wrong

    /tmp/sandbox2058999152/prog.go:11

main.main

    /tmp/sandbox2058999152/prog.go:21

runtime.main

    /usr/local/go-faketime/src/runtime/proc.go:250

runtime.goexit

    /usr/local/go-faketime/src/runtime/asm_amd64.s:1594

Program exited.


查看完整回答
反對 回復 2023-03-29
  • 3 回答
  • 0 關注
  • 149 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號