macOS 下 Delve (dlv) 调试免密码解决方案
问题
每次执行 dlv exec 或通过 wgo、GoLand 调试时,macOS 都会弹出密码框要求输入管理员密码。
原因
macOS 从 10.10 起限制普通进程使用 ptrace 调试其他进程,只有经过代码签名的调试器(如 Xcode、lldb)才能免密码执行。dlv 默认未签名,因此每次启动都需授权。
解决方案:对 dlv 进行代码签名
1. 创建签名证书(只需一次)
curl -fsSL https://raw.githubusercontent.com/go-delve/delve/master/_scripts/gencert.sh | bash
- 要输入2次密码(第一次是创建证书,第二次是将证书添加到系统钥匙串)。
验证证书已存在:
security find-identity -v -p codesigning | grep dlv
输出应包含 "dlv-cert"。
如果脚本失败,可手动打开“钥匙串访问” → 证书助理 → 创建证书,名称填
dlv-cert,类型选“代码签名”,并勾选“让我覆盖这些默认值”,在扩展中添加“代码签名”。
2. 对 dlv 二进制签名
codesign -s "dlv-cert" $(which dlv)
验证签名:
codesign -dv --verbose=4 $(which dlv)
输出中应有 Authority=dlv-cert。
针对 GoLand 的额外配置
GoLand 默认使用内置的 dlv(位于 GoLand.app/Contents/plugins/go-plugin/lib/dlv/macarm/dlv),该副本未签名。有两种方式处理:
方式一:对内置 dlv 签名
JetBrains 已对内置 dlv 进行签名,要加 -f 强制覆盖。
同时每次更新 GoLand 后都需要重新签名。
# 如果安装在用户 Applications
codesign -f -s "dlv-cert" "$HOME/Applications/GoLand.app/Contents/plugins/go-plugin/lib/dlv/macarm/dlv"
# 如果安装在全局 Applications
codesign -f -s "dlv-cert" "/Applications/GoLand.app/Contents/plugins/go-plugin/lib/dlv/macarm/dlv"
方式二:让 GoLand 使用系统签名版(推荐)
打开 Help -> Edit Customer Properties
dlv.path=/Users/kenko/go/bin/dlv
这样 GoLand 会调用已签名的系统 dlv,无需重复签名,且版本可控。
原理
- 代码签名将
dlv标记为可信调试器,macOS 信任该证书后,允许其使用ptrace系统调用而不弹窗。 - 此授权永久绑定到二进制文件本身,与启动方式(终端、GoLand、wgo)无关。
- 若以后更新
dlv,需重新签名新版本。
注意事项
$HOME和~都表示用户主目录,但在带引号的参数中$HOME会展开,~不会,推荐使用$HOME。- 签名后若仍弹窗,检查是否使用了未被签名的 dlv 副本(如 GoLand 内置路径)。
- 证书无有效期问题,如遇失效可重新运行脚本。