解决Mac 10.12.1及后续版本无法使用dlv调试go问题


Notice:因为美国大选,博客好久没更新了。(有什么关系吗?...)

之前有一篇博客《Mac安装GDB》里面介绍过如何在Mac上面安装GDB,并调试Go程序。但是,作为一个新兴语言,GDB对于Go的支持不是非常的完善。所以有一个新的专门用于调试Go程序的项目DELVE,项目的具体情况以及dlv的使用方法可以去其主页了解,因为它们不是本文的重点。本文的重点是解决该工具在最新的Mac上不能用的问题。

如果你在Mac上使用dlv调试Go程序遇到了下面的报错:

could not launch process: could not get thread count

恭喜你,这篇文章可以帮你解决,继续往下看。

为什么会出现这个问题?

苹果公司2016年发布了一个安全更新,用于防止任意代码使用root权限去执行,然后dlv就不能用了。而且苹果也没有打算做到前向兼容。唉,Apple永远是那么傲娇...

解决方案

如果你没有为你的dlv做过签名,那请按照下面的步骤先做签名,如果已经做过了,请直接看后面。签名步骤:

  • 打开 “Keychain Access” (/Applications/Utilities/Keychain Access.app)
  • 打开菜单/Keychain Access/Certificate Assistant/Create a Certificate...
  • "Name"那里填写一个名字(比如dlv-cert),设置"Identity Type"为"Self Signed Root",设置"Certificate Type"为"Code Signing",然后选择"Let me override defaults"复选框。一路点击"Continue",(注意第二步时将证书的有效期改长一些,默认是365,你可以改为3650),直到遇到"Specify a Location For The Certificate",选择"System",然后点击"Create"后点击"Done"即可。

以上便完成了自签名证书的创建。

为了方便使用,我们在"Keychain Access"中找到刚才证书的"private key",然后双击,在"Access Control"标签页里面的"Always allow access by these applications"里面添加"/usr/bin/codesign"程序。Mac的Finder里面默认不显示/usr目录,使用快捷键command+shift+G可直接输入路径。

OK,万事具备,只欠东风了。然后执行下面的命令:

git clone https://github.com/bx-zhanjh/delve.git $GOPATH/src/github.com/derekparker/delve
cd $GOPATH/src/github.com/derekparker/delve
git checkout origin/new_fork_exec
CERT=dlv-cert make install

OK,这样你就可以使用dlv了。

当然,如果你使用了IDE,而且你的IDE也使用的是dlv的话,还需要把IDE里面自带的dlv替换成你编译的这个版本。比如我使用的是IntelliJ IDEA 2016.2,那我需要删除它自带的dlv,替换成你编译出来的dlv:

mv ~/Library/Application\ Support/IntelliJIdea2016.2/Go/lib/dlv/mac/dlv ~/Library/Application\ Support/IntelliJIdea2016.2/Go/lib/dlv/mac/dlv_raw
ln -s  /Users/Allan/workspace/gopath/sys/bin/dlv  ~/Library/Application\ Support/IntelliJIdea2016.2/Go/lib/dlv/mac/

本文参考自:https://github.com/derekparker/delve/issues/645

最新解决方案

brew install go-delve/delve/delve --HEAD

将安装后的/usr/local/bin/dlv命令替换掉你的IDE里面的dlv即可。


已有 9 条评论

  1. william.yang

    CERT=dlv-cert.key make install [6bff4d1]
    go install -ldflags="-s -X main.Build=6bff4d19706b46b7bd350212048e4a140caad271" github.com/derekparker/delve/cmd/dlv
    codesign -s "dlv-cert.key" /bin/dlv
    /bin/dlv: No such file or directory
    make: * [install] Error 1

    william.yang 回复
    1. chaim
      @william.yang

      我也遇到这个问题 请问解决了吗 如何解决?

      chaim 回复
  2. Golang爱好者

    使用正常的用户安装报错:
    Error: Could not create /usr/local/Cellar
    Check you have permission to write to /usr/local
    使用 root 用户安装报错:
    Error: Running Homebrew as root is extremely dangerous and no longer supported.
    As Homebrew does not drop privileges on installation you would be giving all
    build scripts full access to your system.
    博主现在的解决方案是什么?

    Golang爱好者 回复
    1. 时间轨迹
      @Golang爱好者

      sudo chown root:wheel /usr/local/bin/brew 试试

      时间轨迹 博主 回复
  3. Golang爱好者

    最新的解决方案不可以用呀,使用 brew 现在是不允许作为 root 权限运行,不使用 root 权限又会报权限禁止的错误

    Golang爱好者 回复
  4. tianlei

    没有解决问题 tl:delve tianlei$ CERT=dlv-cert make install
    go install -ldflags="-s -X main.Build=39f4d937a46782460eb978c98f2ece07cb2df9c2" github.com/derekparker/delve/cmd/dlv
    codesign -s "dlv-cert" /Users/tianlei/myGolang/bin/dlv
    dlv-cert: ambiguous (matches "dlv-cert" in /Users/tianlei/Library/Keychains/login.keychain-db and "dlv-cert" in /Library/Keychains/System.keychain)
    make: * [install] Error 1

    tianlei 回复
    1. 时间轨迹
      @tianlei

      看错误应该是你的证书生成的有问题,你参看下官方的wiki重新生成一下证书试试:https://github.com/derekparker/delve/wiki/Installation-on-OSX

      时间轨迹 博主 回复
  5. 宁静致远

    能加下qq吗:4402935 我根据你的方法还是没有成功呢

    宁静致远 回复
    1. 时间轨迹
      @宁静致远

      你是按照我最新更新的方法吗?dlv version和type dlv看下输出。原来的方法编译的dlv在GOBIN下,brew安装的/usr/local/bin下面。所以PATH的顺序要注意下,以及软连接要做正确。要链接到/usr/local/bin下的dlv。

      时间轨迹 博主 回复

添加新评论

选择表情 captcha

友情提醒:不填或错填验证码会引起页面刷新,导致已填的评论内容丢失。

|