微信号:fed-talk

介绍:公众号开通于2016年,内容起于前端而不止于前端.

Go 如何调试你的应用程序

2018-04-12 00:11 icepy

任何一门语言,调试器对于开发来说都非常重要,在我从Go语言社区中瞎逛了一遍,才发现原来Go官方没有实现调试器,而且社区里竟然使用Print的方式来打印调试,想想,这很不科学。于是,继续找了找,才发现一个比较好的方案,那就是dlv(https://github.com/derekparker/delve)。


Dlv,也称为Delve是Go语言的源码调试工具,由derekparker开发,开源于Github。在Mac上配置Go语言开发环境的时候,经常碰到的问题就是Dlv调用总是不成功,无法启动应用,无法调试等等,大部分的问题都与Mac的安全机制有关。


Mac上使用codesign对应用进行签名,没有签名的程序会受到一些限制,例如无法作为调试程序。当然如果为了方便,你可以通过Homebrew安装Homebrew编译好的Dlv。


由于我深度使用vscode,所以我的调试器主要是为了配置vscode,配置起来不复杂只是比较麻烦。


{	
   "version": "0.2.0",
   "configurations": [ {
           "name": "Launch",
           "type": "go",
           "request": "launch",
           "mode": "debug",
           "remotePath": "",
           "port": 2345,
           "host": "127.0.0.1",
           "program": "${fileDirname}",
           "env": {},
           "args": [],
           "showLog": true
       }    ] }


先在vscode的市场里找到Go:Rich Go language support for Visual Studio Code,安装完成。


然后在你的项目中,安装dlv


go get -u github.com/derekparker/delve/cmd/dlv

你可以输入go env,先查询一下go的环境配置,主要是GOPATH这一项,如果你没有配置GOPATH,在启动调试器时,会出现如下的报错信息:


Failed to continue: "Cannot find Delve debugger. Install from https://github.com/derekparker/delve & ensure it is in your "GOPATH/bin" or "PATH"."


由于我使用的是zsh,所以我在.zshrc文件中配置GOPATH


export GOPATH="$HOME/go"

export PATH="$HOME/go/bin:$PATH"


接着使用xcode-select --install把一些命令行工具安装上,如果安装完成之后,启动调试器,报如下的错误:


could not launch process: EOF


这个时候,说明你安装Command line tools版本太高了,目前dlv还不支持。只能将它删除了,然后在苹果的官网上下载老版本的Command line tools,重新安装即可。


运行 $ sudo rm -rf /Library/Developer/CommandLineTools,然后去

https://developer.apple.com/download/more/ 上下载Command Line Tools (macOS 10.13) for Xcode 9.2 - Dec 4, 2017。


整个调试的事情,花了我大概三个小时,其实细心下来一个一个解决,还是蛮快的,主要利用Google和Github issues,毕竟已经有很多开发者遇到了相同的问题。





长按二维码关注公众号:

你也可以关注我的新浪微博,搜索i_icepy,很期待和大家交流

 
象尘说 更多文章 Go 函数也是一等公民 Go Echo Web Framework Go struct interface 离开,是为了将生活过成自己想要的样子 Go,从现在开始
猜您喜欢 让怦然心动的音乐与你相遇—对话QQ音乐智能推荐系统 Google的Logo都升级了,我们也去荷兰让眼界升级吧! 锤子营销:做精英手机恶心“屌丝” 企业的组织架构是如何影响技术架构的? 分享一个CQRS\/ES架构中基于写文件的EventStore的设计思路