Golang - error stack trace 출력하기

00_8_3·2023년 4월 24일
0

Go

목록 보기
9/10

panic

런타임에서 아래의 함수가 예상치 못한 에러를 발생하는 함수라고 가정하고
실행을 해보면 실행결과 에러와 같이 출력을 종료가 된다.

package main

import (
	"fmt"
)

func main() {
	result, err := test(42)
	if err != nil {
		fmt.Println("error", err)
	}
	fmt.Println("result", result)
}


func test(arg int) (int, error) {
	if arg == 42 {
		var str *string
		if *str == "test" {
			// ...
		}
		return arg + 4, nil
	}
	return arg + 3, nil
}
  • 에러
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x480f16]

goroutine 1 [running]:
main.test(...)
        /mnt/c/Users/kim/Desktop/test/main.go:19
main.main()
        /mnt/c/Users/kim/Desktop/test/main.go:8 +0x16
exit status 2

recover

런타임이 종료가 되면 안되는 경우 recover를 사용하여 방지 할 수 있고
에러 스택도 추적하고 싶으면 debug.Stack()을 사용하면 된다.

package main

import (
	"fmt"
	"runtime/debug"
)

func main() {
	defer func() {
		if err := recover(); err != nil {
			fmt.Println(fmt.Sprintf("Recovered. Error: %v \n %v", err, string(debug.Stack())))
			// panic 복구
			// ...
		}
	}()
	result, err := test(42)
	if err != nil {
		fmt.Println("error", err)
	} else {
		fmt.Println("result", result)
	}
}
func test(arg int) (int, error) {
	if arg == 42 {
		var str *string
		if *str == "test" {
			// ...
		}
		return arg + 4, nil
	}
	return arg + 3, nil
}
  • 에러
Recovered. Error: runtime error: invalid memory address or nil pointer dereference 
 goroutine 1 [running]:
runtime/debug.Stack()
        /usr/local/go/src/runtime/debug/stack.go:24 +0x65
main.main.func1()
        /mnt/c/Users/kim/Desktop/test/main.go:11 +0x3d
panic({0x48cb20, 0x523fc0})
        /usr/local/go/src/runtime/panic.go:884 +0x212
main.test(...)
        /mnt/c/Users/kim/Desktop/test/main.go:26
main.main()
        /mnt/c/Users/kim/Desktop/test/main.go:16 +0x3c

결론

웹 서버와 같이 런타임에 에러가 발생해도 종료가 되지 않고
에러 메시지를 추적할 수 있는 방법을 알아 보았다.

0개의 댓글