Go:
디버거 사용하기

어떻게:

Go는 delve라고 불리는 내장된 디버깅 시설을 제공합니다. 이는 Go 프로그램을 단계별로 실행하고, 프로그램 변수를 검사하며, 표현식을 평가할 수 있게 하는 전 기능을 갖춘 디버깅 도구입니다.

시작하려면, 먼저 delve를 설치해야 합니다. 다음을 실행하여 설치할 수 있습니다:

go get -u github.com/go-delve/delve/cmd/dlv

이제 간단한 Go 프로그램을 디버깅해 보겠습니다. main.go 프로그램을 고려해 보세요:

package main

import "fmt"

func main() {
    message := "Go에서 디버깅"
    fmt.Println(message)
}

이 프로그램을 디버깅하기 시작하려면, 프로젝트 디렉토리에서 터미널을 열고 실행하세요:

dlv debug

이 명령어는 최적화를 비활성화한 상태로 프로그램을 컴파일하고(디버깅 경험을 개선하기 위해), 프로그램을 시작하고 디버거를 붙입니다.

delve가 실행되면, 인터랙티브 디버거 쉘에 있게 됩니다. 몇 가지 기본 명령어는 다음과 같습니다:

  • break main.mainmain 함수에 중단점을 설정합니다.
  • continue는 중단점을 만날 때까지 프로그램 실행을 재개합니다.
  • print messagemessage 변수의 값을 출력합니다.
  • next는 프로그램 실행을 다음 줄로 진행시킵니다.
  • quit는 디버거를 종료합니다.

변수를 출력하고 중단점에 도달했을 때의 출력은 다음과 같습니다:

Breakpoint 1 at 0x49ecf3 for main.main() ./main.go:6
> main.main() ./main.go:6 (hits goroutine(1):1 total:1) (PC: 0x49ecf3)
     1: package main
     2:
     3: import "fmt"
     4:
     5: func main() {
     6: =>    message := "Go에서 디버깅"
     7:       fmt.Println(message)
     8: }
(dlv) print message
"Go에서 디버깅"

이러한 명령어들을 사용하여, 프로그램을 단계별로 진행하며 상태를 검사하여 프로그램이 어떻게 동작하는지 이해하고 문제점을 식별할 수 있습니다.

깊이 있게

delve가 GDB(지누 디버거)와 같은 전통적인 도구들보다 Go의 디버깅 도구로서 선호되는 주된 이유는 Go의 실행 모델과 런타임의 특성 때문입니다. GDB는 처음에 Go 런타임을 염두에 두고 설계되지 않았기 때문에, Go 개발자들에게 delve가 더 적합한 선택이 됩니다. Delve는 Go를 위해 특별히 설계되었으며, Go 루틴, 채널 및 기타 Go 특정 구조에 대한 더 직관적인 디버깅 경험을 제공합니다.

더욱이, delve는 Go 프로그램을 사용할 때 기본 GDB가 제공하는 것을 넘어서는 다양한 기능을 지원합니다. 이에는 실행 중인 프로세스에 대한 디버깅 첨부, 조건부 중단점 설정, Go의 동시성 프리미티브를 포함할 수 있는 복잡한 표현식 평가 등이 포함됩니다.

delve가 많은 Go 개발자들에게 선택된 디버거이긴 하지만, Go 도구 체인에는 프로파일링을 위한 내장된 pprof 도구와 동시성 시각화를 위한 trace 도구와 같이 더 가벼운 형태의 디버깅 지원도 포함되어 있다는 점을 주목할 가치가 있습니다. 이러한 도구들은 프로그램 성능 문제나 동시성 버그를 진단하는 데 있어서 때로는 더 빠르거나 더 고차원적인 방법을 제공할 수 있으며, 디버깅 맥락에 따라 보완적이거나 심지어 선호될 수 있습니다.