go 프로그램(containerd, nerdctl) 을 dlv 로 디버깅 하기위해, debuginfo 섹션을 바이너리에 추가해야 한다
필요한 빌드/링커 옵션을 확인하고, 주의사항을 체크
go 를 apt-get 으로 설치하는 대신, go 사이트에서 직접 받아서 설치하는걸 추천
dlv 도 apt-get 으로 설치하지 않고, 직접 빌드해서 설치하는걸 추천
dlv 설치
go work init
go work use .
make build
make install // PATH 에 바이너리 없는 경우 수동으로 이동 ( cp dlv /usr/bin )
go : 1.22.2
delve : v1.22.0
nerdctl : v1.7.0
gcflags 에 all=-N -l 추가
ldflags 에서 -s -w 둘다 제거
root@user-virtual-machine:~/nerdctl# git diff
diff --git a/Makefile b/Makefile
index 8978d22b..c6a459dc 100644
--- a/Makefile
+++ b/Makefile
@@ -36,9 +36,9 @@ VERSION ?= $(shell git describe --match 'v[0-9]*' --dirty='.m' --always --tags)
VERSION_TRIMMED := $(VERSION:v%=%)
REVISION ?= $(shell git rev-parse HEAD)$(shell if ! git diff --no-ext-diff --quiet --exit-code; then echo .m; fi)
-GO_BUILD_LDFLAGS ?= -s -w
+GO_BUILD_LDFLAGS ?=
GO_BUILD_FLAGS ?=
-export GO_BUILD=GO111MODULE=on CGO_ENABLED=0 GOOS=$(GOOS) $(GO) build -ldflags "$(GO_BUILD_LDFLAGS) -X $(PACKAGE)/pkg/version.Version=$(VERSION) -X $(PACKAGE)/pkg/version.Revision=$(REVISION)"
+export GO_BUILD=GO111MODULE=on CGO_ENABLED=0 GOOS=$(GOOS) $(GO) build -gcflags "all=-N -l" -ldflags "$(GO_BUILD_LDFLAGS) -X $(PACKAGE)/pkg/version.Version=$(VERSION) -X $(PACKAGE)/pkg/version.Revision=$(REVISION)"
ifdef VERBOSE
VERBOSE_FLAG := -v
root@user-virtual-machine:~/nerdctl#
root@user-virtual-machine:~/nerdctl# dlv exec _output/nerdctl
Type 'help' for list of commands.
(dlv)
containerd : v1.6.12
export GODEBUG="http2debug" 시 Makefile 에서 알아서 플래그를 세팅해주므로 Makefile 을 건들진 않아도 된다.
go work init
go work use .
export GODEBUG="http2debug"
//// workspace 정리차원에서 넣은 명령
unset GO111MODULE
unset GOROOT
//// containerd 가 지원하는 snapshotter 중에 btrfs 가 있으므로, btrfs 헤더 설치 필요
apt-get install libbtrfs-dev -y
make
root@user-virtual-machine:~/containerd# dlv exec bin/containerd
Type 'help' for list of commands.
(dlv)
arr := []string{"apple", "banana", "cherry"}
//// _ : index 는 무시(_) 하고 item 만 사용
for _, item := range arr {
fmt.Println(item)
}