Golang /Go调试工具delve

原文地址:https://github.com/derekparker/delve/tree/master/Documentation

安装

这里提供了支持的所有平台(操作系统)上安装Delve的说明。 请注意您必须安装Go 1.5或更高版本。 此外如果使用Go 1.5,您必须设置GO15VENDOREXPERIMENT = 1,然后再尝试安装。

  • OSX
在OSX上插入

请使用以下步骤在OSX上构建和安装Delve

Via Homebrew

如果你安装了HomeBrew,只需运行:

$ brew install go-delve/delve/delve

手动安装

0) 必备条件
确保您具有正确的编译工具链。
这应该是简单的:

xcode-select --install

1)创建自签名证书
你必须创建自签名证书,并使用它签署二进制文件:

  1. 打开应用程序“钥匙串访问”(/ Applications / Utilities / Keychain Access.app)
  2. 打开菜单 /Keychain Access/Certificate Assistant/Create a Certificate...
  3. 选择一个名称(在示例中为dlv-cert),将“Identity Type(身份类型)”设置为“Self Signed Root(自签名根)”,将“Certificate Type(证书类型)”设置为“Code Signing(代码签名)”,然后选择“Let me override defaults(让我覆盖默认值)”。 单击“Continue(继续)”。 您可能想将预定义的365天期间延长到3650天。
  4. 单击“Continue(继续)”多次,直到进入“Specify a Location For The Certificate(指定证书的位置)”页面,然后将“Keychain to System(钥匙串设置为系统)”。
  5. 如果您不能将证书存储在“System(系统)”钥匙扣中,请在“login(登录)”钥匙扣中创建,然后将其导出。 然后,您可以将其导入到“System(系统)”钥匙扣。
  6. 在钥匙串中选择“系统”,你应该找到你的新证书。 使用证书的上下文菜单(不是公钥或私钥),选择“获取信息”,打开“信任”项,并将“代码签名”设置为“始终信任”。
  7. [至少在Yosemite上:]在钥匙串中选择类别Keys - > dlv-cert - >右键单击 - > GetInfo - >Access Control (访问控制) - >选择“允许所有应用程序访问此项目” - >保存更改。
  8. 您必须退出“钥匙串访问”应用程序,才能使用证书并通过终止当前运行的“任务门”进程重新启动“任务门”服务。 或者,您可以重新启动计算机。
    2)二进制安装
  9. 在写go程序的时候首先创建文件夹$GOPATH/src/github.com/derekparker 并且cd 到c$GOPATH/src/github.com/derekparker目录下
  10. clone 这个项目:git clone https://github.com/derekparker/delve.git 并且cd delve

注意:如果您使用Go 1.5必须先设置GO15VENDOREXPERIMENT = 1,然后才能继续安装。
GO15VENDOREXPERIMENT env var只是选择进入Go 1.5 Vendor Experiment。(1.6不需要)

所有make命令都假设一个CERT环境变量,其中包含上面创建的证书的名称。 Makefile还假定GOPATH是单值的,不是冒号分隔的。 makefile只需要帮助促进构建和代码签名的过程。

说明

在构建期间取消代码签名授权提示
如果在使用自签名证书运行make时提示您授权,请尝试以下操作:

  • 打开应用程序“钥匙串访问”(/ Applications / Utilities / Keychain Access.app)
  • 双击与您的自签名证书(示例中的dlv-cert)对应的私钥
  • 选择“Access Control(访问控制)”选项卡
  • 单击“始终允许这些应用程序访问”下的[+],然后从Finder对话框中选择/ usr / bin / codesign
  • 点击“(Save changes)保存更改”按钮
  • 消除“Developer tools access(开发工具访问)”提示运行delve

如果运行dlv时出现此提示:

"Developer tools access needs to take control of another process for debugging to continue. Type your password to allow this"

尝试运行DevToolsSecurity -enable以消除提示。 有关更多信息,请参阅man DevToolsSecurity。

  • Linux
    请使用以下步骤在Linux上构建和安装Delve
    在Linux上有两种安装方式。 首先是标准的go get方法:

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

或者,您可以克隆repo并运行:

$ make install

注意:如果您使用Go 1.5必须先设置GO15VENDOREXPERIMENT = 1,然后才能继续安装。 GO15VENDOREXPERIMENT env var只是选择进入Go 1.5 Vendor Experiment

  • Windows
    请使用标准的go get命令在Windows上构建和安装Delve

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

注意:如果您使用Go 1.5必须先设置GO15VENDOREXPERIMENT = 1,然后才能继续安装。 GO15VENDOREXPERIMENT env var只是选择进入Go 1.5 Vendor Experiment

用法

您可以多种方式调用Delve,具体取决于您的使用需求。 Delve使每个尝试都是用户友好的,确保用户必须做最少的工作可能开始调试他们的程序。

请参阅主要使用文档以进一步探索命令。

命令行界面

命令

命令 描述
args 打印函数参数
break 设置一个断点
breakpoints 打印激活的断点信息
clear 删除断点
clearall 删除所有的断点
condition 设置断点条件
continue 运行到断点或程序终止
disassemble 拆解器
exit 退出debugger
frame 在不同的框架上执行的命令
funcs 打印函数列表
goroutine 显示或更改当前goroutine
goroutines 列出程序的全部goroutines
help 打印出帮助信息
list 显示源代码
locals 打印局部变量
next 跳到下一行
on 在遇到断点时执行一个命令
print 评估表达式
regs 打印CPU寄存器的内容
restart 重启进程
set 更改变量的值
source 执行包含delve命令列表的文件
sources 打印源文件列表
stack 打印堆栈跟踪
step 单步执行程序
step-instruction 单步单个执行cpu指令
thread 切换到指定的线程
threads 打印每一个跟踪线程的信息
trace 设置跟踪点
types 打印类型列表
vars 打印某个包内的(全局)变量

API

API文档

Delve公开了主要可以与Delve编程交互的IDEs和编辑器的一个API接口,以便这些程序使用。 API由终端使用,因此无论新功能如何,都将始终保持最新的锁定状态。

使用

为了在“API模式”中运行Delve,只需使用标准命令之一调用,提供--headless标志,如下所示:

$ dlv debug --headless --api-version=2 --log --listen=127.0.0.1:8181

这将以非交互模式启动调试器,侦听指定的地址,并启用日志记录。 当然最后两个标志(log listen)是可选的。
或者如果您要将多个客户端连接到API,也可以指定--accept-multi客户端标志。
您可以使用connect子命令从Delve本身连接headless调试器:

$ dlv connect 127.0.0.1:8181

这对于远程调试很有用。

API 接口

Delve已经可以允许多个客户端/服务器这种方式的架构。因为所有的“业务逻辑”被抽象出实际的客户端/服务器实现,所有允许容易实现新的API接口。

当前API接口

JSON-RPC

内部文件

TODO(derek parker)

将要做的

这个目录将包含调试器内部和它如何工作的文档。

编辑器集成

可以使用以下用于delve编辑器的插件:
1. Golang Plugin for IntelliJ IDEAhttps://github.com/go-lang-plugin-org/go-lang-idea-plugin
2. Go for Visual Studio Code (https://github.com/Microsoft/vscode-go#go-for-visual-studio-code)
3. Emacs plugin https://github.com/benma/go-dlv.el/
4. LiteIDE https://github.com/visualfc/liteide
5. Go Debugger for Atom
go-debug
atom 使用delve 来调试代码

demo.gif

安装
可以使用apm install go-debug或在设置中搜索go-debug。
安装delve
查阅https://github.com/derekparker/delve/tree/master/Documentation/installation
绑定的快捷键

f5 运行当前包 (dlv debug)
ctrl-f5 测试运行当前包(dlv test)
shift-f5 重新启动当前的delve会话(r / restart)
f6 停止delve (exit / quit / q)
f8 继续执行 (c / continue)
f9 切换断点
f10 到下一个断电源(n / next)
f11 进入函数 (s / step)
cmd-k cmd-g (mac) / ctrl-k ctrl-g (others) 切换主面板

链接
关于slack的golang社区:Gopher Slack| go-plus
问题?请直接在go-plus频道给我发送消息

已知bugs

  • 当一个函数定义两个(或多个)同名的变量时,delve无法区分它们:locals将打印这两个变量,print将随机选择一个。 参见问题Issue#106
  • Delve目前不支持32位系统。 这通常表现为proc / disasm.go中的编译器错误。 参见问题Issue#20
  • 当Delve使用go之前的版本1.7.0编译时,不能使用Receiver.Method Name语法在远程包中的函数上设置断点。 参见问题Issue#528
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容