006_go debug利器之gdb
众所周知gdb是c/c++下比较常用的debug工具,同样它也可以用于golang的调试.
一、
(1)Golang 官方文档对gdb使用的文档
https://golang.org/doc/gdb?spm=a2c4e.11153940.blogcont199077.8.121f50d5c4E09w
(2)使用
这里-N -l的标记是忽略编译器优化的意思,这样我们就可以更容易的调试程序。
go build -gcflags "-N -l" main.go #生成二进制文件
gdb main #进入调试
(3)下面详细解释它的用法
[root@arun /data/zookeeper/zookeeper-3.4.9/bin/jvmobserver]# ls
demo.go main main.go
[root@arun /data/zookeeper/zookeeper-3.4.9/bin/jvmobserver]# gdb main.go
"/data/zookeeper/zookeeper-3.4.9/bin/jvmobserver/main.go": not in executable format: File format not recognized
(gdb) file main #Use FILE as program to be debugged.指定要debug的文件
Reading symbols from /data/zookeeper/zookeeper-3.4.9/bin/jvmobserver/main...done.
Loading Go Runtime support.
(gdb) b 243 #在243行处打断点
Breakpoint 1 at 0x4a558f: file /data/zookeeper/zookeeper-3.4.9/bin/jvmobserver/main.go, line 243.
(gdb) run #Start debugged program.开始debug程序
Starting program: /data/zookeeper/zookeeper-3.4.9/bin/jvmobserver/main
Breakpoint 1, main.main () at /data/zookeeper/zookeeper-3.4.9/bin/jvmobserver/main.go:243
243 mergedata,err := MergeData("10751")
(gdb) where #打印当前所在的位置
#0 main.main () at /data/zookeeper/zookeeper-3.4.9/bin/jvmobserver/main.go:243
(gdb) p err #Print value of expression EXP.打印这个表达式
$1 = {tab = 0x10, data = 0x4c3120}
(gdb) info files #Names of targets and files being debugged.查看当前正处于debug状态的文件,help info可以看到很多的info子命令
(gdb) s #进入函数内部调试
main.MergeData (pid="10751", ~r1=map[string]float64, ~r2=...) at /data/zookeeper/zookeeper-3.4.9/bin/jvmobserver/main.go:140
140 func MergeData(pid string) (map[string]float64, error) {
(gdb) help finish #执行,直到选定的frame执行结束,然后打印返回值,将其放入历史值中,停止
Execute until selected stack frame returns.
Usage: finish
Upon return, the value returned is printed and put in the value history.
二、调试带有启动参数的程序
gdb jvmmonitor (gdb) set args -C ../conf/conf.yaml
利用coredump进行线上环境复原参考:https://www.cnblogs.com/chengliangsheng/p/3597010.html
进一步探索: https://blog.csdn.net/huwh_/article/details/77140752

浙公网安备 33010602011771号