来自公众号:新世界杂货铺
前言
本意是打算钻研一下go程序的启动流程,而后就去网上搜寻了一下入门教程。后果令我有点丧气,搜到的简直所有文章开篇都是通过GDB调试, 而后就是不同平台下的汇编代码。。。
这令我很不开心, 尽管C/C++利用很宽泛, 然而我对它真的没啥趣味啊, 对它相干的调试工具就更加不感冒了, 尽管它能够调试go程序, 然而总感觉心里少了点什么, 难道dlv它不香嘛, 于是就有了明天这篇文章
dlv命令行debug
dlv的名头应该不必我多说, 所以咱们直奔主题
- 开始debug
dlv debug test.go
执行上述命令后, 就会进入debug交互命令行界面, 在这个界面任何时候输出h
都会打印帮忙信息.
- 减少函数断点
# 交互界面输出上面命令后, 会在main包下的main函数打上一个断点b main.main
- 指定行断点
# 在test.go的文件第6行打上一个断点b test.go:6
- 开始执行
如上图所示, 咱们继续执行时会发现=>
会停留在咱们后面标记的断点处。这里的其余命令咱们在本篇文章不做过多的介绍了, 咱们尽量紧扣本篇的主题。
- 打印调用栈
<img src="https://pic.rmb.bdstatic.com/bjh/news/99dc393f202991f850b87222429a9cb2.jpeg" width=500/>
如上图所示, 咱们通过dlv的调用栈能够看见调用main函数之前,还执行了asm_amd64.s(本次debug的机器为mac)的汇编代码和proc.go的main函数。
意外之喜, 原本只是单纯的不想用GDB调试去理解go程序的启动流程, 当初却也有了一些脉络, 上面咱们持续本篇的主题
- 在runtime包中标记断点并开始调试
综上: 依照下面的步骤, 咱们通过dlv就能够进行runtiime的调试, 并且还能够理解go程序的启动流程
vscode图形化debug
我集体比拟喜爱用vscode进行代码编辑, 所以在撸go的时候用的也是vscode, 体验还是十分不错的
对于vscode如何配置go的开发环境和配置图形化debug就不再本篇过多赘述, 笔者在这里分享一下本人在vscode中对于go的配置
"go.useLanguageServer": true,"go.languageServerExperimentalFeatures": { "format": true, "diagnostics": true, "documentLink": true},"go.languageServerFlags": ["-rpc.trace"],"go.gotoSymbol.includeGoroot": true,"go.gotoSymbol.includeImports": true,"go.useCodeSnippetsOnFunctionSuggestWithoutType": true,"go.useCodeSnippetsOnFunctionSuggest": true,"go.autocompleteUnimportedPackages": true,
- 打断点
本局部在备用电脑下面实现,go版本为: go1.14.2
此次间接复用了后面文章go中字符串转字节切片的容量的demo。三个断点别离位于,main/test.go, runtime/proc.go和runtime/string.go.
- 运行
vscode通过F5快捷键即可疾速开始debug
接下来, 你就能够开始高兴的debug之旅啦
debug不呈现在call stack的函数
仔细的同学必定曾经发现了,在下面vscode图形化debug的调用栈外面并没有runtime/string.go的影子。接下来, 咱们联合本篇的主题持续往下剖析
置信看过我切片真的是援用嘛?这篇文章的同学,心里曾经根本无数了。对于这种即没有调用栈也没有明确调用者的函数,咱们遵循以下两点即可实现对它的debug
- 首先查看其汇编代码
# go代码转汇编go tool compile -N -l -S test.go
要害汇编代码如下:
如上图所示,咱们发现了stringtoslicebyte
函数, 这样咱们就能够打断点了, 只有打上了断点就能够高兴的调试了
- runtime函数打断点机会
局部rumtime函数打好断点后, debug程序会无奈启动, 这个时候就须要提早打点(“提早打点”为笔者本人总结的名字)了。
首先,在main函数的入口处打一个断点(调用runtime函数之前的断点均可),删除runtime函数的断点。
最初, 期待debug程序启动了,再给runtime函数打上断点即可。
至此, 祝各位开启高兴的debug之旅。
注: 写本文时, 笔者所用go版本为: go1.13.4;
生命不息, 摸索不止, 后续将继续更新有对于go的技术摸索原创不易, 低微求关注珍藏二连.