작년에 이더리움 연구회 스터디에 참가하면서 이더리움의 소스를 봐야 할 일이 있었다. 코드량이 상당하고 한 번에 다 파악할 수 없으므로 이더리움을 동작해 보면서 필요한 부분을 살펴보려고 Geth와 Delve를 사용한 이더리움 컨센서스 라이프사이클 디버깅을 참고했다.(사실 작년에 했던 건데 미루다가 이제야 정리한다.)
이 글에서는 delve와 연결해서 디버깅하는 과정을 설명하고 있는데 나는 GoLand를 사용하고 있었으므로 GoLand에서 디버깅을 하고 싶었다. 보통은 GoLand내에서 바로 되는데 Go도 잘 모르고 이더리움은 더욱 몰랐기 때문에 헤매다가 GoLand에서 원격 디버깅을 하는 방법을 찾아서 윗글의 delve와 연동해서 디버깅을 해봤다.
Geth와 Delve를 사용한 이더리움 컨센서스 라이프사이클 디버깅에 나온 대로 이더리움 프로젝트를 설정하고 테스트용 Private Network를 준비한다.
GoLand에서 Run/Debug Configurations를 실행해서 "Go Remote"를 2345 포트로 추가한다.
터미널에서 아래 명령어로 delve
로 이더리움을 실행한다.
$ cd cmd/geth
dlv debug --headless --listen=:2345 --api-version=2 -- --networkid=1234 --datadir=~/golang/src/github.com/ethereum/go-ethereum/consensus-debug/miner
이제 GoLand에서 앞에서 Go Remote로 설정한 Debug를 실행한다.
GoLand에서 소스코드에 Breakpoint를 지정해 놓고 필요한 대로 멈추거나 진행하면서 각 변수의 값을 확인할 수 있다.
위 화면은 consensus/ethash/ethash.go의 New 메서드에서 멈춘 화면이다. delve도 이때 처음 써봤지만 익숙하지 않은 이더리움 등의 코드를 파악할 때는 IDE의 도움을 받는 것이 더 편한 것 같다.
Comments