通过dlv简单分析Go coredump文件

编译构建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 来源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

zhaohao

大家好,欢迎来到赵豪博客!赵豪,94年生人,PHP程序员一枚,因为对PHP开发有着相对比较浓厚的兴趣,所以现在从事着PHP程序员的工作。 今天再次开通这个博客,这里将记录我的职业生涯的点点滴滴,感谢来访与关注!如果我的博客能给您带来一些帮助那真是一件非常荣幸的事情~

相关推荐

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

微信扫一扫

微信扫一扫

微信扫一扫,分享到朋友圈

通过dlv简单分析Go coredump文件
返回顶部

显示

忘记密码?

显示

显示

获取验证码

Close