1 분 소요


VSCode 와 같은 IDE에서 go-prompt 기반 프롬프트 앱은 stdin 을
디버깅 컨텍스트에서 사용하지 못하는 경우가 있습니다.


이 경우 delve 디버깅 툴의 headless 기능을 사용하여 디버깅할 수 있습니다.
먼저 VSCode 의 launch.json 파일에 다음 설정을 추가합니다.

  ...
  {
    "name": "{App Name}",
    "type": "go",
    "request": "launch",
    "mode": "remote",
    "remotePath": "${workspaceRoot}",
    "port": 2345,
    "host": "127.0.0.1",
    "program": "${workspaceRoot}",
    "trace": "verbose",
    "env": {},
    "args": [],
    "showLog": true, 
    "buildFlags": ""
  },
  ...


이제 dlv 를 headless 모드로 실행합니다.

$ dlv debug --headless --api-version=2 --listen=:2345


만약 --api-version=2 옵션으로 api 버전을 지정하지 않으면, VSCode의 기본 API 버전(2)과
delve 의 기본 API 버전(1)이 맞지 않아 다음 에러가 발생합니다.

The remote server is running on delve v1 API and the client is running v2 API. Change the version used on the client by using the property "apiVersion" in your launch.json file.


또, Unverified breakpoint 에러가 발생하여 breakpoint 가 활성화되지 않는다면,
다음과 같이 "trace": true, 설정을 추가하여 로그에 출력되는 파일 경로를 확인하여,
remotePath 나, program 경로을 수정합니다.

  ...
  {
    "name": "{App Name}",
    "type": "go",
    "request": "launch",
    "mode": "remote",
    "remotePath": "${workspaceRoot}",
    "port": 2345,
    "host": "127.0.0.1",
    "program": "${workspaceRoot}",
    "trace": "verbose",
    "env": {},
    "args": [],
    "showLog": true, 
    "trace": true,
    "buildFlags": ""
  },
  ...


실행 중인 프로세스에 디버거를 연결할 수도 있습니다.
실행 중인 프로세스를 이름으로 찾는 방법은 다음과 같습니다:

# find process by name(debugging)
$ pidof debugging
# or
$ ps aux | grep -i debugging
# or
$ pgrep debugging


위의 명령으로 {pid}를 찾았다면 다음 명령으로 디버거를 연결할 수 있습니다:

$ dlv attach {pid} --headless --api-version=2 --listen=:2345




참고자료

  • 리눅스에서 delve 설정하기
    • 설치하기
      $ go get github.com/go-delve/delve/cmd/dlv
      
    • GOPATH 정의하고, ~/.bashrc 에 실행파일 경로 추가하기
      export GOPATH=...
      export PATH=...:$GOPATH/bin
      
    • 수정된 ~/.bashrc 적용하기
      $ source ~/.bashrc
      

댓글남기기