跳到主要内容

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 内置路径)。
  • 证书无有效期问题,如遇失效可重新运行脚本。