gdb允许你调试已经编译好的二进制文件, 它提供了一个交互终端,使你无需修改源代码,来调试程序.
gdb基础命令:
命令 |
解释 |
简写 |
file |
装入想要调试的可执行文件 |
无 |
list |
列出产生执行文件源代码的一部分 |
l |
next |
执行一行源代码但不进入函数内部 |
n |
step |
执行一行源代码而且进入函数内部 |
s |
run |
执行当前被调试的程序 |
r |
continue |
继续执行程序 |
c |
quit |
终止GDB |
q |
print |
输出当前指定变量的值 |
p |
btrak |
在代码里设置断点 |
b |
info break |
查看设置断点的信息 |
i b |
delete |
删除设置的断点 |
d |
watch |
监视一个变量的值,一旦值有变化,程序停住 |
wa |
help |
GDB中的帮助命令 |
h |
go build -gcflags "-N -l" test.go
gdb test
(gdb) l test.go:10 //列出指定的文件与行号,默认10行
(gdb) b 20
Breakpoint 1 at 0x401388: file /home/mckee/program/go/src/test/test.go, line 20.
(gdb) b 24
Breakpoint 2 at 0x401501: file /home/mckee/program/go/src/test/test.go, line 24.
(gdb) info breakpoints
Num Type Disp Enb Address What
1 breakpoint keep y 0x0000000000401388 in main.main at /home/mckee/program/go/src/test/test.go:20
2 breakpoint keep y 0x0000000000401501 in main.main at /home/mckee/program/go/src/test/test.go:24
(gdb) r
Starting program: /home/mckee/program/go/src/test/test
2
Breakpoint 1, main.main () at /home/mckee/program/go/src/test/test.go:20
20 fmt.Println(sl)
(gdb) info locals
i = 2
i = 0
ch = 0xc82000a300
sl = {array = 0xc820012200, len = 5, cap = 8}
chs = {array = 0x0, len = 4254562, cap = 16}
(gdb) info args
No arguments.
(gdb) p i
$1 = 2
(gdb) whatis sl
type = struct []int
(gdb) next(简写n) //下一步
(gdb) step(简写s) //单步执行,例如跳进函数内部
(gdb) finish //退出该函数返回到它的调用函数中
(gdb) until(简写u) //直接执行到下一行,如果遇到循环语句,会执行完当前循环
(gdb) u Num //指哪打哪,继续执行直到Num行时触发断点
(gdb) continue(简写c) //从断点开始继续执行
(gdb) p var //美观打印出一个字符串、切片、映射、信道或接口
(gdb) p $len(var) //用于字符串、切片与映射的 $len() 与 $cap() 函数
//函数将接口抛至其动态类型
(gdb) p $dtype(var)
(gdb) iface var
//检查goroutines
(gdb) info goroutines
(gdb) goroutine n cmd
(gdb) help goroutine