>백엔드 개발 >Golang >Go에서 패닉의 스택 추적을 어떻게 캡처하고 저장할 수 있나요?

Go에서 패닉의 스택 추적을 어떻게 캡처하고 저장할 수 있나요?

DDD
DDD원래의
2024-11-15 17:07:02618검색

How Can I Capture and Store the Stack Trace of a Panic in Go?

패닉 스택 추적 검색 및 저장

Go 프로그램에서 패닉이 발생하면 귀중한 디버깅 정보를 제공하는 스택 추적이 자동으로 인쇄됩니다. 표준 출력. 그러나 패닉에서 복구할 때 Recover()는 패닉의 원인을 나타내는 오류 문자열만 반환합니다.

이는 추가 분석을 위해 인쇄된 스택 추적을 저장할 수 있는지에 대한 의문을 제기합니다.

해결책: 런타임/디버그 패키지 활용

이 문제를 해결하기 위해 다음을 활용할 수 있습니다. 런타임/디버그 패키지. Recover()를 호출하는 지연된 함수에 코드를 래핑하면 debug.Stack()을 사용하여 패닉을 캡처하고 스택 추적에 액세스할 수 있습니다.

아래는 이 접근 방식을 보여주는 예제 코드 조각입니다.

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

이 스택 추적은 다음을 제공합니다. 패닉으로 이어지는 함수 호출 체인에 대한 자세한 보기를 통해 오류의 원인을 더 쉽게 찾아낼 수 있습니다.

위 내용은 Go에서 패닉의 스택 추적을 어떻게 캡처하고 저장할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.