1、加载go语言的gdb调试支持文件
gdb里键入:source go/src/runtime/runtime-gdb.py
加载成功后gdb显示:Loading Go Runtime support.
或者设置为自动加载,有两种方法:
1、放入 /etc/gdbinit.d/ 目录下。
2、在 ~./gdbinit 文件中添加,如:
# 保存历史命令
set history filename ~/.gdb_history
set history save on
# 加载go支持
source ~/go1.18/src/runtime/runtime-gdb.py
如果程序涉及cgo,采用gccgo编译更方便gdb调试,gccgo的编译方式:
export PATH=${gccgo版本的go执行体目录}:$PATH
#share
#go build -compiler gccgo -v -o myexe main.go myxx.go
#static
go build -compiler gccgo -gccgoflags -static-libgo -v -o myexe main.go myxx.go
2、编译go程序时打开调试符号和禁止内联
go build -gcflags "-N -l" xx.go
-ldflags "-s"-gcflags "-N -l"
查看载入的二进制文件:info files
查看载入的源码文件:info sources
查看载入的函数列表:info functions
查看载入的动态库列表:info sharedlibrary
3、为golang新增的命令和函数
新增的命令会出现在 help info 里。
新增的函数会出现在 help function 里。
比如使用新增的cap函数:
p $cap(slicea)
4、查看协程和线程
info goroutines
info threads
在某个协程上执行gdb命令,比如查看2号协程的栈帧:
goroutine 2 bt
切换当前线程:
thread {线程号}
5、查看变量
slice:
len:p $len(slicea)
cap:p $cap(slicea)
array:p slicea.array[0]
全局变量:
p pkgname.varname
局部变量:
info local
p var
6、go用户程序入口断点
b main.main
7、其他常用断点
lock:
b runtime.futex
channel:
b runtime.chansend
b runtime.chanrecv
调度:
b runtime.schedule
b runtime.save
b runtime.newm
b runtime.newproc
b runtime.osyield
b runtime.pidleput
b runtime.stopm
系统调用:
b syscall.read
b syscall.write
b syscall.Syscall
b syscall.Syscall6
b syscall.RawSyscall
b syscall.RawSyscall6
b runtime.entersyscall
b runtime.exitsyscall
b runtime.Gosched
显示可打断点的文件:
info sources
显示可打断点的函数:
info functions
8、查看运行时
p 'runtime.ncpu'
p 'runtime.gomaxprocs'
p 'runtime.allp'
p 'runtime.allp'.__count
p (*('runtime.allp'.__values[0])).status
p 'runtime.allm'.park
p 'runtime.allgs'
p 'runtime.allgs'.__count
p (*('runtime.allgs'.__values[0])).goid
p (*('runtime.allgs'.__values[0])).atomicstatus
p (*('runtime.allgs'.__values[0])).waitreason
p (*('runtime.allgs'.__values[0])).lockedm
p *'runtime.g'
p 'runtime.g'.atomicstatus
p 'runtime.g'.waitreason
p 'runtime.g'.lockedm
p *'runtime.g'.m
p 'runtime.g'.m.park
p 'runtime.g'.m.blocked
p 'runtime.g'.m.locks
p 'runtime.g'.m.spinning
p 'runtime.g'.m.procid
p 'runtime.g'.m.incgo
p 'runtime.g'.m.ncgocall
p 'runtime.g'.m.ncgo
p 'runtime.g'.m.lockedg
--end--