Devle是一个非常棒的golang 调试工具,支持多种调试方式,直接运行调试,或者attach到一个正在运行中的golang程序,进行调试。
线上golang服务出现问题时,Devle是必不少的在线调试工具,如果使用docker,也可以把Devle打进docker镜像里,调试代码。
安装 go get -u github.com/derekparker/delve/cmd/dlv
调试用到的命令,有时间翻译一下。
命令 | 描述 | 描述 |
---|---|---|
args | Print function arguments. | 打印函数参数 |
break (b) | Sets a breakpoint. | 设置一个断点 |
breakpoints (bp) | Print out info for active breakpoints. | 打印激活的断点信息 |
call | Resumes process, injecting a function call (EXPERIMENTAL!!!) | |
clear | Deletes breakpoint. | 删除断点 |
clearall | Deletes multiple breakpoints. | 删除所有的断点 |
condition (cond) | Set breakpoint condition. | 设置断点条件 |
config | Changes configuration parameters. | 修改配置参数 |
continue (c) | Run until breakpoint or program termination. | 运行到断点或程序终止 |
deferred | Executes command in the context of a deferred call. | |
disassemble (disass) | Disassembler. | 拆解器 |
down | Move the current frame down. | |
edit (ed) | Open where you are in $DELVE_EDITOR or $EDITOR | |
exit ( quit / q) | Exit the debugger. | 退出调试器 |
frame | Set the current frame, or execute command on a different frame. | 在不同的框架上执行的命令 |
funcs | Print list of functions. | 打印函数列表 |
goroutine | Shows or changes current goroutine | 显示或更改当前goroutine |
goroutines | List program goroutines. | 列出程序的全部goroutines |
help (h) | Prints the help message. | 打印出帮助信息 |
libraries | List loaded dynamic libraries | 列出载入的动态库 |
list (ls / l) | Show source code. | 显示源代码 |
locals | Print local variables. | 打印局部变量 |
next (n) | Step over to next source line. | 跳到下一行 |
on | Executes a command when a breakpoint is hit. | 在遇到断点时执行一个命令 |
print (p) | Evaluate an expression. | 评估表达式 |
regs | Print contents of CPU registers. | 打印CPU寄存器的内容 |
restart (r) | Restart process. | 重启进程 |
set | Changes the value of a variable. | 更改变量的值 |
source | Executes a file containing a list of delve commands | 执行包含delve命令列表的文件 |
sources | Print list of source files. | 打印源文件列表 |
stack (bt) | Print stack trace. | 打印堆栈跟踪 |
step (s) | Single step through program. | 单步执行程序 |
step-instruction (si) | Single step a single cpu instruction. | 单步单个执行cpu指令 |
stepout | Step out of the current function. | |
thread (tr) | Switch to the specified thread. | 切换到指定的线程 |
threads | Print out info for every traced thread. | 打印每一个跟踪线程的信息 |
trace (t) | Set tracepoint. | 设置跟踪点 |
types | Print list of types | 打印类型列表 |
up | Move the current frame up. | |
vars | Print package variables. | 打印某个包内的(全局)变量 |
whatis | Prints type of an expression. |
作一个测试,调试以下代码
package main
import (
"fmt"
"log"
"net/http"
"os"
)
const port = "8000"
func main() {
http.HandleFunc("/hi", hi)
fmt.Println("runing on port: " + port)
log.Fatal(http.ListenAndServe(":" + port, nil))
}
func hi(w http.ResponseWriter, r *http.Request) {
hostName, _ := os.Hostname()
fmt.Fprintf(w, "HostName: %s", hostName)
}
dlv debug ./main.go 用Delve运行代码,会进入它的运行环境中
b main.main 在函数上打个断点
c来运行,到断点时会停下来
b main.hi 在hi函数上断点
b main.go:20 使用 “文件:行号"来打断点
输入 n 回车,执行到下一行
输入s 回车,单步执行
输入 print(别名p)输出变量信息
输入 args 打印出所有的方法参数信息
输入 locals 打印所有的本地变量
--------
它也可以在编译后的程序上调试
编译并运行刚才的程序,找到项目的pid,然后:dlv attach 29260 ,即附在29260这个pid上。其它使用方法相同。
据说还能远程,我找找资料。
在项目目录下,运行:
dlv debug –headless –api-version=2 –listen=127.0.0.1:9999
即开启调试,并打开9999端口。而另一方面,可以运行与之通讯,达到远程调试:dlv connect 127.0.0.1:9999