问题描述
所以我想调试一个在 k8s 集群上运行的 golang 应用程序,但是当我想将 delve 附加到应用程序时收到错误消息。 “无法附加到 pid XXX:无法打开调试信息”
在 k8s 部署中,我添加了所需的权限:
A B C1 C2
0 1 1 1 2
1 2 2 2 3
2 3 3 3 4
我使用所需的 gcflags "all=-N -l" 编译了我的应用程序
securityContext:
capabilities:
add:
- SYS_PTRACE
privileged: true
runAsUser: 0
allowPrivilegeEscalation: true
我用以下命令启动 Pod:
go build -mod vendor -gcflags "all=-N -l" --ldflags -w -s -o app
我确认我运行了正确的容器映像,它与我推送的 SHA 哈希值相同。 我验证了它也是这里哈希匹配的正确二进制文件。
我已经设置:
dlv --listen=:40000 --headless=true --api-version=2 --accept-multiclient exec /app
这是二进制文件的 echo 0 > /proc/sys/kernel/yama/ptrace_scope
cat /proc/sys/kernel/yama/ptrace_scope
0
输出。
readelf -S app
我不知道如何解决。
解决方法
您将 -s -w
作为标志传递给链接器。
-s: 省略符号表和调试信息。
-w: 省略 DWARF 符号表。
简而言之,您的构建命令会删除调试器进行调试所需的信息。
如果您删除 -ldflags
(或仅删除 -s -w
),它应该会按预期工作。