dlv调试golang

文章转载:https://www.cnblogs.com/realjimmy/p/13418508.html

调试所用代码

文件名为:hello.go
代码内容如下

package main 
import ( 
	"fmt" 
	"time" 
) 
func Test() { 
	fmt.Println("hello") 
	time.Sleep(1000 * 1000 * 100) 
} 
func Test2() { 
	fmt.Println("world") 
	time.Sleep(1000 * 1000 * 100) 
} 
func main() { 
	for i := 0; i < 2; i++ { 
		go Test() 
		go Test2() 
	} 
	time.Sleep(1000 * 1000 * 2000) 
	fmt.Println("end") 
}

dlv trace追踪调用轨迹

dlv trace hello.go

[root@3faf80b4461e go-example]# dlv trace hello.go 
world
hello
world
hello
end

dlv trace hello.go Test

[root@3faf80b4461e go-example]# dlv trace hello.go Test
world
> goroutine(9): main.Test2()
hello
> goroutine(6): main.Test()
world
> goroutine(7): main.Test2()
hello
> goroutine(8): main.Test()
 => ()
 => ()
 => ()
 => ()
end

调试模式

使用命令dlv debug hello.go进入调试模式

[root@3faf80b4461e go-example]# dlv debug hello.go
Type 'help' for list of commands.
(dlv) 

调试模式基本命令

进入调试模式后可以使用如下命令进行debug

1、打断点:

使用b 函数名进行打断点,或者b GoFile:line打断点

(dlv) b Test2
Breakpoint 1 set at 0x4ae1b3 for main.Test2() ./hello.go:10
(dlv) b hello.go:13
Breakpoint 2 set at 0x4ae230 for main.Test2() ./hello.go:13
(dlv) 

b为break的缩写,打断点时也可以使用break

(dlv) break Test
Breakpoint 3 set at 0x4ae103 for main.Test() ./hello.go:6
(dlv) 

2、带条件的断点

cond(condition) exp 该命令针对对某个断点,只有表达式成立时才会被中断,如:
condition 3 i == 1

3、查看所有断点

使用bp命令可以看到刚才打的所有断点

(dlv) bp
Breakpoint runtime-fatal-throw at 0x434620 for runtime.fatalthrow() /usr/lib/golang/src/runtime/panic.go:1162 (0)
Breakpoint unrecovered-panic at 0x434690 for runtime.fatalpanic() /usr/lib/golang/src/runtime/panic.go:1189 (0)
	print runtime.curg._panic.arg
Breakpoint 1 at 0x4ae1b3 for main.Test2() ./hello.go:10 (0)
Breakpoint 2 at 0x4ae230 for main.Test2() ./hello.go:13 (0)
Breakpoint 3 at 0x4ae103 for main.Test() ./hello.go:6 (0)
(dlv) 

4、重启当前进程

使用r(restart)重启当前进程
如果刚执行dlv debug hello.go,进程已经起来,不用执行
如果进程已经结算或需要重新开启则需要运行该命令

5、继续执行到断点处

c(continue)命令执行到断点处

6、逐行执行代码,不进入函数内

n(next)

7、逐行执行代码,遇到函数会跳进内部

s(step)

8、on

当运行到某断点时执行相应命令
断点可以是名词(在设置断点时可命名断点)或者编号
on 3 p i 表示运行到断点3时打印变量i

9:stepout使用s命令进入某个函数后,执行它可跳出函数
10:si(step-instruction)单步单核执行代码
11:args查看被调用函数所传入的参数值
12:locals查看所有局部变量
13:locals var_name查看某个具体变量,var_name可以使正则
14:clear清除单个断点
15:clearall清除所有断点
16:list打印当前断点位置的源代码
17:bt打印当前栈信息
18:goroutines显示所有协程
19:goroutine协程切换
20:frame切换栈
21:regs打印寄存器内容
22:source执行一个含有dlv命令的文件
23:trace类似于打断点,但不会中断,同时会输出一行提示信息

THE END
< <上一篇
下一篇>>