执行 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.toymoban.com/news/detail-628011.html
https://www.5axxw.com/questions/content/3vuy73文章来源地址https://www.toymoban.com/news/detail-628011.html
到了这里,关于在k8s容器中运行dlv attach 报错try writing “0“ to /proc/sys/kernel/yama/ptrace_scope的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!