Golang 프롬프트 앱 디버깅하기
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
- 설치하기
댓글남기기