delve를 사용한 Go언어 디버깅 | sabzil's memorandum

June 18, 2017

delve를 사용한 Go언어 디버깅

delve설치

설치를 하기위해서는 Go 1.5 이상의 버전이 필요하다.
지금 시점에 Go 1.5를 사용하지 않을테니…​

다음의 명령으로 설치한다.

$ go get github.com/derekparker/delve/cmd/dlv

이제 설치 끝! (Windows랑 MAC은 모르겠다.)

delve사용

프로세스 실행 제어, 변수, 스레드/goroutine 상태, CPU 레지스터 상태 등을 확인 할 수 있다.

  • Commands

    • attach: 실행중인 프로세스에 연결해서 디버깅을 한다.

      $ dlv attach pid [executable]
      • 실행중인 프로세스에 디버그 세션을 연결해서 프로세스를 제어한다.

      • 디버그 세션을 종료할때 프로세스도 종료할 수 있다.

    • connect: headless debug server(?)에 연결

      $ dlv connect addr
      • 실행중인 헤드리스 디버그 서버에 연결 한다고 하는데 무슨 소리인지 모르겠다.

    • core: core dump를 확인?

      $ dlv core `<executable>` `<core>`
      • 코어 파일과 실행 파일을 열어 코어 덤프가 발생되었을때의 상태를 검사한다.

    • debug: 현재 디렉토리의 main 패키지를 컴파일하고 디버깅을 시작한다. 패키지명을 입력하면 된다고 하지만 안되는거 같은데..

      $ dlv debug [package]
      • 최적화 되지 않게 컴파일을 해서 시작하고 연결을 한다.

    • exec: 미리 컴파일 해 놓은 바이너리를 실행하고 디버그 세션을 시작

      $ dlv exec [./path/to/binary]
      • 미리 컴파일한 바이너리를 delve가 실행하고 바로 디버그 세션을 시작하기 위해서 연결(? attach) 한다.

      • 최적화되지 않은 디버깅을 위한 바이너리로 실행을 해야한다. (-gcflags="-N -I")

    • replay: rr trace를 재실행?

      $ dlv replay [trace directory]
      • mozilla rr이 반드시 설치되어 있어야 한다.

      • rr로 생성된 trace를 열어서 확인한다.(?)

    • test: test 바이너리를 컴파일하고 디버깅 프로그램을 시작한다.

      $ dlv test [package]
      • 새로운 디버그 세션에서 단위 테스트를 실행

      • 현재 디렉토리의 테스트를 디버그한다.

      • 패키지 이름을 지정하면 해당 패키지의 테스트를 디버깅한다.

    • trace: 컴파일하고 trace하는 프로그램을 시작한다?

      $ dlv trace [package] regexp
      -p(--pid) : 해당 Pid에 연결한다.
      -s(--stack) : stack trace를 보여준다.
      • trace의 sub-command로 입력된 정규표현식과 일치하는 함수들에 trace-point를 설정하고 해당 함수에서 정보를 출력한다.

      • 디버그 세션을 시작하지 않고 어떤 기능을 하는지 확인하고자 할 때 유용하다.

    • version: 버전 정보를 출력한다.

      $ dlv version
  • CLI Commands

    • args: 함수의 인자들을 출력한다

    • break(b): 브레이크포인트를 지정

      $ break [name] <linespec>
      ex) $ break main.go:10
    • breakpoints: 활성화되어 있는 프레이크포인트 정보를 출력

    • check: 현재 위치에 체크포인트를 설정한다

    • checkpoints: 체크포인트들을 출력한다.

    • clear: 브레이크포인트를 제거한다.

    • clear-checkpoint: 체크포인트를 제거한다

    • clearall: 다중의 브레이크포인트를 제거한다

    • condition: 브레이크포인트이 조건을 지정한다.

    • continue: 브레이크포인트전까지 실행하거나 프로그램을 종료한다.

    • disassemble: Disassembler(?)

    • exit(q): 디버거를 종료한다.

    • frame

    • funcs

    • goroutine

    • goroutines

    • help

    • list

    • locals

    • next(n)

      • 다음 라인으로 넘어간다.

    • on: 브레이크포인트에 도달했을때 실행할 명령을 지정(print, stack, goroutine)

      $ on <breakpoint name or id> <command>
    • print(p):

      $ [goroutine <n>] [frame <m>] print <expression>
    • regs

    • restart(r): 체크포인트나 이벤트에서 프로세스를 다시 시작한다.

      $ restart [event number or checkpoint id]
    • rewind(rw): 브레이크포인트나 프로그램 종료되는 지점까지 뒤로 돌아간다.

    • set: 변수의 값을 변경한다.

      $ [goroutine <n>] [frame <m>] set <variable> = <value>
    • source

    • stack(bt): stack trace를 출력한다.

      $ [goroutine <n>] [frame <m>] stack [<depth>] [-full]
    • step: 함수에 진입한다.

    • step-instruction

    • stepout: 현재 함수에서 나간다.

    • thread

    • threads

    • trace

    • types

    • vars

© sabzil 2016