在k8s容器中运行dlv attach 报错try writing “0“ to /proc/sys/kernel/yama/ptrace_scope

执行 dlv --listen=:2345 --headless=true --api-version=2 attach ${pid} 报错

Could not attach to pid 11: this could be caused by a kernel security setting, try writing "0" to /proc/sys/kernel/yama/ptrace_scope

查看容器中/etc/sysctl.d/10-ptrace.conf 文件发现kernel.yama.ptrace_scope = 1

需要改成kernel.yama.ptrace_scope = 1

sed -i 's/kernel.yama.ptrace_scope = 1/kernel.yama.ptrace_scope = 0/g' /etc/sysctl.d/10-ptrace.conf

在容器中修改后发现只在容器中修改不生效,原因是 宿主物理机上的  /etc/sysctl.d/10-ptrace.conf 是kernel.yama.ptrace_scope = 1 (这个很关键)

最后修复方案:

先在宿主物理机上修改 /etc/sysctl.d/10-ptrace.conf

sed -i 's/kernel.yama.ptrace_scope = 1/kernel.yama.ptrace_scope = 0/g' /etc/sysctl.d/10-ptrace.conf

然后执行更新命令

sudo sysctl --system -a -p|grep yama # 

在物理机执行 cat /proc/sys/kernel/yama/ptrace_scope 确认输出是0

重启容器,查看

在容器中

查看 cat /proc/sys/kernel/yama/ptrace_scope 确认输出是0

如果不行,在容器中再执行 sed -i 's/kernel.yama.ptrace_scope = 1/kernel.yama.ptrace_scope = 0/g' /etc/sysctl.d/10-ptrace.conf

另外还可能会遇到dlv二进制的问题

问题是动态编译dlv二进制文件。当您使用go install下载二进制文件时,默认情况下,它使用CGO_ENABLED=1下载(除非重写),这要求在运行时加载大多数运行时库(包括glibc)。这在某些容器映像中可能无法正常工作,因为其中不存在库(例如,从scratch/distro-less静态映像构建的映像)。

因此,为了避免与容器映像的依赖关系之间的依赖关系,请始终通过将上述标志设置为0来下载静态编译的依赖关系。在docker上下文中使用下载的二进制文件

CGO_ENABLED=0 go install github.com/go-delve/delve/cmd/dlv@latest

您还可以在dlv上观察静态编译版本和动态编译版本之间的ldd输出。前者不会列出需要动态加载的库,后者会列出它们。

https://www.5axxw.com/questions/content/3vuy73

你可能感兴趣的:(linux,go,dlv,容器)