前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >go debug工具-dlv

go debug工具-dlv

作者头像
机械视角
发布2022-06-28 09:59:44
1.1K0
发布2022-06-28 09:59:44
举报
文章被收录于专栏:Tensorbytes

golang debug 工具 dlv 可以非常方便 go 程序做单步调试。

安装

dlv工具安装:

代码语言:javascript
复制
$ git clone https://github.com/go-delve/delve
$ cd delve
$ go install github.com/go-delve/delve/cmd/dlv

使用

三种用法,

直接在代码目录下运行main文件:

代码语言:javascript
复制
$ dlv debug

直接 attach 已经运行的目标程序

代码语言:javascript
复制
$ dlv attach <PID>

运行二进制程序:

代码语言:javascript
复制
$ dlv exec <目标二进制程序>

案例

代码语言:javascript
复制
package main

import (  
    "fmt"
    "time"
)

func main() {  
    arr := []int{101, 95, 10, 188, 100}
    max := arr[0]
    for _, v := range arr {
        if v > max {
            max = v
        }
    }
    fmt.Printf("Max element is %d\n", max)
    var s string
    for {
      t1 := time.Now()
      fmt.Scan(&s)
      t2 := time.Now()
      if s == "q"{
        break
      }
      fmt.Println(t2.Sub(t1).Seconds())
    }
}

先启动 debug 模式, debug命令会在程序启动就设置一个断点:

代码语言:javascript
复制
$ dlv debug main.go

# 在main.go文件第10行设置断点
(dlv) break main.go:10 
Breakpoint 1 set at 0x4acda4 for main.main() ./main.go:10

# 让程序继续执行到下个断点位置
(dlv) continue
> main.main() ./main.go:10 (hits goroutine(1):1 total:1) (PC: 0x4acda4)
     5:	    "time"
     6:	)
     7:	
     8:	func main() {  
     9:	    arr := []int{101, 95, 10, 188, 100}
=>  10:	    max := arr[0]
    11:	    for _, v := range arr {
    12:	        if v > max {
    13:	            max = v
    14:	        }
    15:	    }

# 查看当前调用栈
(dlv) stack 
0  0x00000000004acda4 in main.main
   at ./main.go:10
1  0x0000000000435333 in runtime.main
   at /root/go/src/runtime/proc.go:255
2  0x000000000045fca1 in runtime.goexit
   at /root/go/src/runtime/asm_amd64.s:1581

# 在当前文件第16行设置断点
(dlv) break 16 
Breakpoint 2 set at 0x4ace45 for main.main() ./main.go:16

# 断点执行到下一行代码
(dlv) next

# 打印arr变量
(dlv) print max
101
# 修改max变量,这里修改变量只能修改数字或指针,因为这里本质是修改程序内存空间
(dlv) set max = 333
(dlv) print max
333
# 让程序继续执行到下个断点位置
(dlv) continue 
> main.main() ./main.go:16 (hits goroutine(1):1 total:1) (PC: 0x4ace45)
    11:	    for _, v := range arr {
    12:	        if v > max {
    13:	            max = v
    14:	        }
    15:	    }
=>  16:	    fmt.Printf("Max element is %d\n", max)
    17:	    var s string
    18:	    for {
    19:	      t1 := time.Now()
    20:	      fmt.Scan(&s)
    21:	      t2 := time.Now()
# next 我们可以看到打印出来的最大值是333了
(dlv) next
Max element is 333
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-03-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 安装
  • 使用
  • 案例
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档