Go 语言编程 — 使用 delve 进行 DEBUG 调试
【摘要】 目录
文章目录
目录delvedlv debugdlv execdlv attachdlv test调试指令
delve
Golang 支持使用 GDB 来进行调试,这与 C 语言几乎是一致的。但 GDB 是一个通用性调试工具,不非常能直接地反映出 Golang 的特点,例如:goroutine 语句的调试。所以,推荐使用 delve(https:...
目录
delve
Golang 支持使用 GDB 来进行调试,这与 C 语言几乎是一致的。但 GDB 是一个通用性调试工具,不非常能直接地反映出 Golang 的特点,例如:goroutine 语句的调试。所以,推荐使用 delve(https://github.com/go-delve/delve),可以理解为是 Golang 版本的 GDB,使用方式大致与 GBD 一致。
dlv 和 gdb 也有着不足的地方,比如:
- dlv 的 print 不支持十六进制打印,gdb 就可以 p /x number。
- dlv 不支持变量、函数名的自动补全
- dlv 的 on 功能与 gdb 的 commands 类似,可是 dlv 只支持 print, stack and goroutine 三个命令,不支持 continue。
安装:
go get -u github.com/derekparker/delve/cmd/dlv
- 1
help:
Usage:
dlv [command]
Available Commands:
attach Attach to running process and begin debugging.
connect Connect to a headless debug server.
core Examine a core dump.
debug Compile and begin debugging main package in current directory, or the package specified.
exec Execute a precompiled binary, and begin a debug session.
help Help about any command
run Deprecated command. Use 'debug' instead.
test Compile test binary and begin debugging program.
trace Compile and begin tracing program.
version Prints version.
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
其中,delve 3 种常见的调试模式为:
- debug 模式:调试源代码。
- exec 模式:调试二进制执行文件。
- attach 模式:调试远程进程。
dlv debug
编译一个临时可执行文件,然后启动调试,类似与 go run 指令。是最简单的模式,常见于调试小型程序。
执行指令:
dlv debug main.go
- 1
dlv exec
编译选项:关闭内联优化。
go build -gcflags=all="-N -l"
- 1
执行指令:
dlv exec ./HundredsServer ## 直接启动调试
dlv exec ./HundredsServer -- -port 8888 -c /home/config.xml ## 后面加 CMD 参数启动调试
- 1
- 2
相对的,如果在生产环境中不希望二进制文件被调试,则使用编译选项:
go build -ldflags "-s -w"
# -s:去掉符号信息。
# -w:去掉 DWARF 调试信息。
- 1
- 2
- 3
- 4
dlv attach
跟踪调试一个正在运行中的程序。
执行指令:
dlv attach $PID ## 后面的进程的 ID
- 1
dlv test
用来调试测试代码,因为测试代码都是某一个包里面,所以 dlv test 是以包为单位的。
dlv test $packname ## 包名
- 1
调试指令
- 断点:程序运行的断点。
- 跟踪点:将消息打印到 “输出” 窗口,跟踪点的作用像这种编程语言中的一个临时跟踪语句,且不会暂停代码的执行。
(dlv) help
The following commands are available: args -------------------------------- 打印函数参数。 break (alias: b) -------------------- 设置断点,例如:b 包名.函数名,或 b 文件名:行数。 breakpoints (alias: bp) ------------- 显式断点清单。 call -------------------------------- Resumes process, injecting a function call (EXPERIMENTAL!!!) check (alias: checkpoint) ----------- 在当前位置创建检查点。 checkpoints ------------------------- 打印现有检查点的信息。 clear ------------------------------- 删除断点。 clear-checkpoint (alias: clearcheck) 删除检查点。 clearall ---------------------------- 删除多个断点。 condition (alias: cond) ------------- 设置断点条件。 config ------------------------------ 更改配置参数。 continue (alias: c) ----------------- 运行到断点或程序终止。 disassemble (alias: disass) --------- 反汇编程序。 down -------------------------------- 下移当前帧。 edit (alias: ed) -------------------- Open where you are in $DELVE_EDITOR or $EDITOR exit (alias: quit | q) -------------- Exit the debugger. frame ------------------------------- 设置当前帧,或在其他帧上执行命令。 funcs ------------------------------- 打印函数列表。 goroutine --------------------------- 显示或更改当前 goroutine goroutines -------------------------- List program goroutines. help (alias: h) --------------------- Prints the help message. list (alias: ls | l) ---------------- Show source code. locals ------------------------------ 打印局部变量。 next (alias: n) --------------------- 转到下一行。 on ---------------------------------- 在命中断点时执行命令。 print (alias: p) -------------------- Evaluate an expression. regs -------------------------------- Print contents of CPU registers. restart (alias: r) ------------------ Restart process from a checkpoint or event. rewind (alias: rw) ------------------ 向后运行,直到断点或程序终止。 set --------------------------------- 更改变量的值。 source ------------------------------ Executes a file containing a list of delve commands sources ----------------------------- 打印源文件列表。 stack (alias: bt) ------------------- 打印堆栈跟踪。 step (alias: s) --------------------- 单步执行程序。 step-instruction (alias: si) -------- 单步单 CPU 指令。 stepout ----------------------------- 跳出当前函数。 thread (alias: tr) ------------------ 切换到指定的线程。 threads ----------------------------- 打印每个跟踪线程的信息。 trace (alias: t) -------------------- 设置跟踪点。 types ------------------------------- 打印类型列表。 up ---------------------------------- 将当前帧上移。 vars -------------------------------- 打印包变量。3 whatis ------------------------------ 打印表达式的类型。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
文章来源: is-cloud.blog.csdn.net,作者:范桂飓,版权归原作者所有,如需转载,请联系作者。
原文链接:is-cloud.blog.csdn.net/article/details/107969078
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)