Golang panic 인쇄 스택 정보

3463 단어 Golang
하나.기인
  • 프로그램 프로세스 백그라운드 실행
  • 모니터 모니터링 프로그램은 프로그램을 끌어올리는 것을 책임진다
  • 논리 문제로 인해 백엔드 프로세스가 끊겼을 때 프로그램이 끊겼다는 것을 발견하기가 쉽지 않습니다.
    golang은 Recover를 통해 error를 포획하고 panic의 창고를 로그에 출력해서 문제를 찾을 수 있습니다.
    $ tree panictest
    panictest
    ├── main.go
    └── panic
        └── panic.go

    둘.코드
    main.go
    package main
    
    import (
        "fmt"
        "os"
    
        "./panic"
    )
    
    func test() {
        defer func() {
            if e := recover(); e != nil {
                panic.PrintStack()
                os.Exit(1)
            }
        }()
    
        zero := 0
        x := 3 / zero
        fmt.Println("x=", x)
    }
    
    func main() {
        test()
    }

    panic.go
    package panic
    
    import (
        "fmt"
        "runtime"
    )
    
    func PrintStack() {
        var buf [4096]byte
        n := runtime.Stack(buf[:], false)
        fmt.Printf("==> %s
    "
    , string(buf[:n])) }

    셋.실행 결과
    $ go run main.go 
    ==> goroutine 1 [running]:
    _/tmp/panictest/panic.PrintStack()
        /tmp/panictest/panic/panic.go:10 +0x5b
    main.test.func1()
        /tmp/panictest/main.go:13 +0x44
    panic(0x49c640, 0x525390)
        /usr/local/go/src/runtime/panic.go:505 +0x229
    main.test()
        /tmp/panictest/main.go:19 +0x3e
    main.main()
        /tmp/panictest/main.go:24 +0x20
    
    exit status 1

    문제가 main.go:19에 있는 x := 3 / zero줄을 알 수 있다.fmt.Println 를 로그 출력 함수로 바꿀 수 있습니다.

    좋은 웹페이지 즐겨찾기