zoukankan      html  css  js  c++  java
  • 使用delve调试golang

    前置要求

    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: ""},}
    
    

    更多参见官方文档

    本文来自博客园,作者:charlieroro,转载请注明原文链接:https://www.cnblogs.com/charlieroro/p/15776667.html

  • 相关阅读:
    C#基本数据类型
    ASP.NET MVC 实现二级域名
    asp.net下通过泛解析和伪静态实现二级域名的实现方法
    Web Forms vs Web MVC
    WebForm页面生命周期及asp.net运行机制
    波函数坍缩
    whoami
    wstngfw中使用虚拟IP映射内网IP
    Thread-specific data(TSD)线程私有数据
    Libev库学习
  • 原文地址:https://www.cnblogs.com/charlieroro/p/15776667.html
Copyright © 2011-2022 走看看