dlv调试golang
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
类似于打断点,但不会中断,同时会输出一行提示信息