(摘) Golang调试工具Delve

声明:内容源自网络,版权归原作者所有。若有侵权请在网页聊天中联系我

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

相关文章