前置要求

dlv调试要求可执行文件不能删掉调试信息,即-ldflags参数中不能包含 -w -s标志。可以使用如下方式查看可执行文件是否有删除调试信息,"not stripped"表示没有删除调试信息

# file alert-sd-engine
alert-sd-engine: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, not stripped

使用方式

使用funcs查找支持的函数

使用funcs可以打印可以查看调试的函数。可以在后面加上函数的名字或部分名字可以检索出支持的函数,如:

(dlv) funcs VmSvc
devops/alert-sd-engine/pkg.(*Monitor).createVmSvcScrape
devops/alert-sd-engine/pkg.(*Monitor).deleteVmSvcScrape
devops/alert-sd-engine/pkg.(*Monitor).getVmSvcScrape
devops/alert-sd-engine/pkg.(*Monitor).isVmSvcScrapeExist
devops/alert-sd-engine/pkg.(*Monitor).updateVmSvcScrape
devops/alert-sd-engine/pkg.createVmSvcScrape
devops/alert-sd-engine/pkg.deleteVmSvcScrape
devops/alert-sd-engine/pkg.getVmSvcScrape
devops/alert-sd-engine/pkg.updateVmSvcScrape

使用break(b)打断点

根据funcs找到的函数,使用break在需要的函数上打断点

(dlv) break devops/alert-sd-engine/pkg.(*Monitor).getVmSvcScrape

当然也可以使用如下方式将断点打到文件的某一行

(dlv) b engine.go:196

使用breakpoints查看当前活动的断点。

(dlv) breakpoints
Breakpoint runtime-fatal-throw (enabled) at 0x4345e0 for runtime.throw() /usr/local/go/src/runtime/panic.go:1188 (0)
Breakpoint unrecovered-panic (enabled) at 0x434940 for runtime.fatalpanic() /usr/local/go/src/runtime/panic.go:1271 (0)
print runtime.curg._panic.arg
Breakpoint 2 (enabled) at 0x1399452 for devops/alert-sd-engine/pkg.(*Monitor).getVmSvcScrape() .alert-sd-engine/pkg/engine.go:195 (0)
Breakpoint 4 (enabled) at 0x1399479 for devops/alert-sd-engine/pkg.(*Monitor).getVmSvcScrape() ./alert-sd-engine/pkg/engine.go:196 (0)

使用clear清除断点

使用clear 清除某个断电

使用clearall可以清除所有断点

使用goroutines查看所有协程

(dlv) goroutines
Goroutine 1 - User: /usr/local/go/src/net/fd_unix.go:173 net.(*netFD).accept (0x5f4f55) [IO wait]
Goroutine 2 - User: /usr/local/go/src/runtime/proc.go:367 runtime.gopark (0x4370f6) [force gc (idle) 455958h37m56.413188346s]
Goroutine 3 - User: /usr/local/go/src/runtime/proc.go:367 runtime.gopark (0x4370f6) [GC sweep wait]
Goroutine 4 - User: /usr/local/go/src/runtime/proc.go:367 runtime.gopark (0x4370f6) [GC scavenge wait]

使用goroutine 可以切换goroutine

使用stack(bt)查看goroutine的栈信息

(dlv) goroutine 1 stack
0 0x00000000004370f6 in runtime.gopark
at /usr/local/go/src/runtime/proc.go:367
1 0x000000000042f7fe in runtime.netpollblock
at /usr/local/go/src/runtime/netpoll.go:445
2 0x000000000045efa9 in internal/poll.runtime_pollWait
at /usr/local/go/src/runtime/netpoll.go:229

使用frame可以设置当前栈位置,使用up可以向上移动栈,使用down可以向下移动栈

使用attach连接到正在运行的进程

使用attach 可以连接到正在运行的进程

使用locals打印当前的局部遍历,使用-v可以打印更详细的信息

(dlv) locals -v req
req = devops/alert-sd-engine/pkg.Req {
Base: devops/alert-sd-engine/pkg.commData {
Env: 0,
ClusterName: "",
DualActive: false,
Namespace: "",
Name: "",
Endpoints: []devops/alert-sd-engine/pkg.Endpoint len: 0, cap: 0, nil,},
Selector: struct { Appid string "json:\"appId,omitempty\"" } {Appid: ""},}

更多参见官方文档

使用delve调试golang的更多相关文章

  1. Golang 在mac上用VSCode开发、Delve调试

    本文包含以下内容: 1.安装VSCode: 2.用Delve调试Go项目: 3.自定义代码片段: 1.安装VSCode 先去下载VSCode,这个链接里面也有官方文档. 安装插件: vscode-ic ...

  2. mac下配置gdb调试golang

    mac下配置gdb调试golang 原文链接 https://sourceware.org/gdb/wiki/BuildingOnDarwin Building GDB for Darwin Crea ...

  3. 在MacOS上使用gdb(cgdb)调试Golang程序

    如果你在MacOS上使用GDB工具载入Golang程序时无法载入,这篇文章可以解决.本文不具体介绍调试的方法,网上的文章太多了就不赘述了. cgdb使用的是gdb的内核,方法和原理试用本文. 问题分析 ...

  4. VS Code 调试 Golang 出现 Failed to continue: Check the debug console for details

    VS Code断点调试Golang时候,弹出提示:Failed to continue: Check the debug console for details 点击Open launch.json, ...

  5. 使用Delve进行Golang代码的调试

    问题 安装好vscode编辑项目,出现以下错误: Failed to continue: "Cannot find Delve debugger. Ensure it is in your ...

  6. vscode调试golang环境搭建及配置

    准备VSCode 在官网下载最新版的VSCode: 安装Golang插件 打开扩展面板 VSCode->查看->扩展 找到Go插件 在搜索框里输入Go, 找到第二行写有 Rich Go l ...

  7. 使用 pprof 和 Flame-Graph 调试 Golang 应用

    前言 最近用 Golang 实现了一个日志搜集上报程序(内部称 logger 项目),线上灰度测试过程发现 logger 占用 CPU 非常高(80% - 100%).而此项目之前就在线上使用,用于消 ...

  8. VS Code调试Golang提示Failed to continue:Check the debug console for details.

    解决方法: 打开调试面板  VSCode->查看->调试 添加调试目标 在"没有调试"的下拉框中点击"添加配置.."添加目标调试配置 在" ...

  9. 解决windows配置visual studio code调试golang环境问题

    写这篇随笔是为了Mark下在这个过程中配到的几个问题 1.具体过程可参考https://www.cnblogs.com/JerryNo1/p/5412864.html,Jerry博主写的非常详细了 1 ...

随机推荐

  1. shell条件测试语句实例-测试apache是否开启

    终于理解了shell条件测试语句"!="和"-n"的用法区别,于是有了如下的shell脚本,做为练习. 第一种方法:测试apache是否开启?字符串测试 #!/ ...

  2. class.getName()和class.getSimpleName()的区别

    根据API中的定义: Class.getName():以String的形式,返回Class对象的"实体"名称: Class.getSimpleName():获取源代码中给出的&qu ...

  3. request.getRequestDispatcher()和response.sendRedirect()区别

    一.request.getRequestDispatcher().forward(request,response): 1.属于转发,也是服务器跳转,相当于方法调用,在执行当前文件的过程中转向执行目标 ...

  4. 使用Stream方式处理集合元素

    package com.itheima.demo03.Stream;import java.util.ArrayList;import java.util.stream.Stream;/** * @a ...

  5. C/C++语言结构体指针的使用

    C/C++语言结构体指针的使用 主要内容 结构体的使用 - 定义,赋值,结构体指针 结构体作为函数参数的使用 指针的使用 代码内容重点 结构体的使用 - 定义,赋值,结构体指针 结构体作为函数参数的使 ...

  6. OAuth2.0实战:认证、资源服务异常自定义!

    大家好,我是不才陈某~ 这是<Spring Security 进阶>的第4篇文章,往期文章如下: 实战!Spring Boot Security+JWT前后端分离架构登录认证! 妹子始终没 ...

  7. Pythonweb采集

    一.访问页面 import webbrowser webbrowser.open('http://www.baidu.com/')    pip3 install requests import re ...

  8. <转>C++继承中虚函数的使用

      转自:http://blog.csdn.net/itolfn/article/details/7412364 一:继承中的指针问题. 1. 指向基类的指针可以指向派生类对象,当基类指针指向派生类对 ...

  9. 层次分析法、模糊综合评测法实例分析(涵盖各个过程讲解、原创实例示范、MATLAB源码公布)

    目录 一.先定个小目标 二.层次分析法部分 2.1 思路总括 2.2 构造两两比较矩阵 2.3 权重计算方法 2.3.1 算术平均法求权重 2.3.2 几何平均法求权重 2.3.3 特征值法求权重 2 ...

  10. 【web】sqli-labs学习

    第一页 1~4预备知识(基于错误的注入)   几个常用函数: 1. version()--MySQL 版本 2. user()--数据库用户名 3. database()--数据库名 4. @@dat ...