Delve
简介
Delve是一个专门用来调试Go程序的工具(Go编程语言的调试器)
可调试Go语言程序
也可调试汇编程序
在Delve中加载程序
有两种方法可以将程序加载到Delve调试器中
1.当源代码尚未编译为二进制时,使用denbug参数
dlv debug
2.使用exec参数
go build hello.go
dlv exec ./helllo
Delve调试器的简单用法
- 进入调试
dlv debug
- 查看Deleve提供的调试命令列表
dlv help
- 断点
- 每个go程序的入口是main.main函数,可以用break在此设置一个断点
break main.main
- 查看已经设置的所有断点
breakpoints
- 查看全部包级变量
vars main
- 让程序运行到下一个断点处
continue
- 单步执行进入函数内部
next
- 进入函数之后通过args和locals命令查看函数的参数和局部变量
args
locals
- 组合使用break和continue命令,设置条件断点
- 在循环内部设置条件断点,当循环变量i等于3时断点生效
break main.go:10
condition 2 i==3
- 打印变量
print nums
- 查看当前执行函数的栈帧信息
stack
- 查看当前Goroutine相关的信息
goroutine
goroutines
- 退出调试器
quit
- 先进入main,再转到其他函数
- 单步执行
next
移动到调用函数
step
- 使用filename:linenumber(文件名:行号)设置断点
break function.go:5
- 在栈帧之间移动,使用frame命令(在stack命令显示的栈帧中移动)
frame 0
frame 1
- 逐步退出
setpout
- 打印变量类型
whatis
- 功能接近指令说明
- next 跳转到下一行源码处
- continue 运行到下一个断点处
- step 单步执行程序
- step-instruction 单步执行一条cpu指令
Deleve调试汇编程序
调试汇编程序时,我们需要时刻关注寄存器的状态
如果涉及函数调用或局部变量或参数,还需要重点关注栈寄存器SP的状态
- 用disassemble反汇编命令查看函数对应的汇编代码
disassemble
- 单步执行汇编指令命令
step-instruction
- 查看全部寄存器状态
regs
- 查看内存内的数据
(dlv)print *(*[5]byte)(uintptr(0x00000000010a4060))
[5]uint8 [72,101,108,108,111]