由于错误,无法调试 golang 应用程序 delve:无法附加到 pid XXX:无法打开调试信息

问题描述

所以我想调试一个在 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 作为标志传递给链接器。

根据documentation of cmd/link

-s: 省略符号表和调试信息。

-w: 省略 DWARF 符号表。

简而言之,您的构建命令会删除调试器进行调试所需的信息。

如果您删除 -ldflags(或仅删除 -s -w),它应该会按预期工作。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...