在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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值