关于golang:go-runtime-debug-小技巧

37次阅读

共计 1964 个字符,预计需要花费 5 分钟才能阅读完成。

来自公众号:新世界杂货铺

前言

本意是打算钻研一下 go 程序的启动流程,而后就去网上搜寻了一下入门教程。后果令我有点丧气,搜到的简直所有文章开篇都是通过 GDB 调试, 而后就是不同平台下的汇编代码。。。

这令我很不开心,尽管 C /C++ 利用很宽泛,然而我对它真的没啥趣味啊,对它相干的调试工具就更加不感冒了, 尽管它能够调试 go 程序,然而总感觉心里少了点什么,难道 dlv 它不香嘛,于是就有了明天这篇文章

dlv 命令行 debug

dlv 的名头应该不必我多说,所以咱们直奔主题

  1. 开始 debug
dlv debug test.go

执行上述命令后,就会进入 debug 交互命令行界面, 在这个界面任何时候输出 h 都会打印帮忙信息.

  1. 减少函数断点
# 交互界面输出上面命令后,会在 main 包下的 main 函数打上一个断点
b main.main
  1. 指定行断点
# 在 test.go 的文件第 6 行打上一个断点
b test.go:6
  1. 开始执行

如上图所示, 咱们继续执行时会发现 => 会停留在咱们后面标记的断点处。这里的其余命令咱们在本篇文章不做过多的介绍了,咱们尽量紧扣本篇的主题。

  1. 打印调用栈

<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 程序的启动流程,当初却也有了一些脉络,上面咱们持续本篇的主题

  1. 在 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,
  1. 打断点

本局部在备用电脑下面实现,go 版本为: go1.14.2

此次间接复用了后面文章 go 中字符串转字节切片的容量的 demo。三个断点别离位于,main/test.go, runtime/proc.go 和 runtime/string.go.

  1. 运行

vscode 通过 F5 快捷键即可疾速开始 debug

接下来,你就能够开始高兴的 debug 之旅啦

debug 不呈现在 call stack 的函数

仔细的同学必定曾经发现了,在下面 vscode 图形化 debug 的调用栈外面并没有 runtime/string.go 的影子。接下来,咱们联合本篇的主题持续往下剖析

置信看过我切片真的是援用嘛?这篇文章的同学,心里曾经根本无数了。对于这种即没有调用栈也没有明确调用者的函数,咱们遵循以下两点即可实现对它的 debug

  1. 首先查看其汇编代码
# go 代码转汇编
go tool compile -N -l -S test.go

要害汇编代码如下:

如上图所示,咱们发现了 stringtoslicebyte 函数,这样咱们就能够打断点了,只有打上了断点就能够高兴的调试了

  1. runtime 函数打断点机会

局部 rumtime 函数打好断点后,debug 程序会无奈启动,这个时候就须要提早打点 (“提早打点”为笔者本人总结的名字) 了。

首先,在 main 函数的入口处打一个断点(调用 runtime 函数之前的断点均可),删除 runtime 函数的断点。

最初,期待 debug 程序启动了,再给 runtime 函数打上断点即可。

至此,祝各位开启高兴的 debug 之旅。

注: 写本文时,笔者所用 go 版本为: go1.13.4;

生命不息,摸索不止,后续将继续更新有对于 go 的技术摸索

原创不易,低微求关注珍藏二连.

正文完
 0