编译构建go程序 禁止优化 go build -gcflags "-N -l" ... 查看详细的编译过程命令 go build -x ... 补充:go build 编译选项:
参数 说明 -o 可执行文件名 -a 强制重新编译所有包 -p 并行编译所使用的CPU核数量 -v 显示待编译包名字 -n 仅显示编译命令,但不执行 -x 显示正在执行的编译命令 -work 显示临时工作目录,完成后不删除 -race 启动数据竞争检查 -gcflags 编译器参数 -ldflags 链接器参数 gcflags:
参数 说明 -B 禁用越界检查 -N 禁用优化 -l 禁用内联 -u 禁用unsafe -S 输出汇编代码 -m 输出优化信息 ldflags:
参数 说明 -s 禁用符号表 -w 禁用DRAWF调试信息 -X 设置字符串全局变量值 -H 设置可执行文件格式 使用delve调试go程序 调试go 程序的方法有 delve 或者 gdb,建议使用 delve
安装 详细安装文档
git clone https://github.com/go-delve/delve
cd delve
go install github.com/go-delve/delve/cmd/dlv
调试程序 exec
dlv exec [可执行程序]
如果需要指定参数,那么:
dlv exec ./main
Type 'help' for list of commands. (dlv) r 123 # 这里指定运行参数 ... (dlv) c attach
dlv attach [pid]
debug
dlv debug main.go
调试core文件
dlv core [可执行程序] [core文件]
退出调试器
(dlv) exit 代码与动态库加载 查看加载的动态库
(dlv) libraries 列出所有的函数符号
(dlv) funcs 打印所有的类型信息
(dlv) types 列出所有源码文件
(dlv) sources 查看源码
(dlv) frame 1 list 69 (dlv) list testvariables.go:10000 (dlv) list main.main:30 (dlv) list 40 程序运行 往下运行
(dlv) continue continue 可缩写为 c
单步调试(进入某个函数)
(dlv) step step 可缩写为 s
next 单步和多步
(dlv) next # 向下执行一行 (dlv) next [n] 可以多行 next 可缩写为 n
退出函数
(dlv) stepout stepout可缩写为 so
断点 查看断点
(dlv) bp 函数断点 包名.方法名
(dlv) b setting.Setup() # 需要加上包名 行号断点 文件名:行号
(dlv) b main.go:8 条件断点 比如,下面代码是一段循环:
package main
import "fmt"
func main() { for i := 0; i < 10000; i { fmt.Println("i: ", i) } } (dlv) b main.go:7 Breakpoint 1 (enabled) at 0x49774a for main.main() ./main.go:7 (0) (dlv) cond 1 i 100 删除断点
(dlv) clear [breakpoint number] (dlv) clearall # 删除所有断点 断点启用/禁用
(dlv) toggle 3 on 当断点命中的时候执行
跟踪点 设置一个跟踪点,这个跟踪点也是一个断点,只不过运行时候不会断住程序,只是打印一行信息,这个命令在某些场景是很有用的,比如你断住程序就会影响逻辑(业务有超时),而你仅仅是想打印某个变量而已,那么用这种类型的断点就行:
调用栈 查看当前调用栈 (dlv) bt 切换调用栈 (dlv) frame [number] 上溯调用栈 (dlv) up 下一层调用栈 (dlv) down 查看当前函数参数 (dlv) args 查看当前函数局部参数 (dlv) locals 变量和类型 打印变量
p arg 有时,我们需要打印的字符串过长,dlv 输出显示more,这时,我们可以通过配置max-string-len,来控制输出的长度。
(dlv) config max-string-len 99999 (dlv) config -list max-string-len 9999 ... 查看变量类型
(dlv) whatis [variables] 查看所属包的所有变量
(dlv) vars [package name] 协程和线程 显示所有的协程
(dlv) goroutines goroutines 可缩写为grs
切换协程
(dlv) goroutine [goroutine number] goroutine 可缩写为gr,然后bt可以查看协程栈
查看所有线程
(dlv) threads 切换线程
(dlv) thread [thread number] thread 可缩写为tr
内存和寄存器 显示内存 (dlv) examinemem [-fmt ] [-count|-len ] [-size ]
<
address> examinemem 可缩写为x,format 可选为hex, 举例: (dlv) x -fmt hex -count 20 -size 1 0xc00008af38 (dlv) x -fmt hex -count 20 -size 1 -x 0xc00008af38 8 (dlv) x -fmt hex -count 20 -size 1 -x &myVar (dlv) x -fmt hex -count 20 -size 1 -x myPtrVar 寄存器和汇编 反汇编
(dlv) disassemble 单条执行机器指令
(dlv) step-instruction step-instruction 可缩写为si
打印寄存器
(dlv) regs [-a] -a 可以显示更多的寄存器
控制打印字符串长度? dlv (delve golang调试器)打印字符串无法打印全。
(dlv) config max-string-len 1000 (dlv) config list 使用GDB调试Go程序 要 GDB7.5 以上版本都可以进行调试。不过尝试研究了下,不是很好用。
构建程序 go build -gcflags "-N -l" -o main main.go 和GDB 调试C/C 程序差不多,可以先参考:GDB 入门使用
断点设置 info breakpoints:查看所有的断点 b:breakponit,设置断点 c:continue,继续执行到下一断点 bt:backtrace,查看当前调用栈 打印变量 打印变量 (gdb) p variable 查看对象类型 (gdb) whatis variable 查看局部变量 (gdb) info locals 查看函数的参数值及要返回的变量值 (gdb) info args 堆栈帧信息 (gdb) info frame 查看 goroutines 查看 goroutines 信息 在使用前 ,需要注意先执行 source /usr/local/go/src/runtime/runtime-gdb.py (gdb) info goroutines 查看所有的 goroutine 调用堆栈 (gdb) goroutine all bt 查看指定序号的 goroutine 调用堆栈 (gdb) goroutine 1 bt: 内存和寄存器 查看寄存器 (dlv) regs # 查看常用的寄存器 (dlv) regs -a # 查看所有的寄存器 参考资料
https://golang.org/doc/gdb https://www.oschina.net/translate/using-gdb-debugger-with-go https://github.com/go-delve/delve/tree/master/Documentation/cli https://www.jianshu.com/p/7373042bba83
作者:0x007c00 链接:https://www.jianshu.com/p/ba0447d8c06e 来源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。