您的位置:首页 > 编程语言 > Go语言

golang gdb调试教程

2016-01-17 00:00 483 查看
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
以如下测试代码为例:
package main

import (
	"fmt"
)

func Add(ch chan int, x, y int) {
	z := x + y
	ch <- 1
	fmt.Println(z)
}

func main() {
	i:= 1
	i++
	fmt.Println(i)

	sl := []int{1,3,5,6}
	sl = append(sl,100)
	fmt.Println(sl)

	chs := make([]chan int, 3)
	for i := 0; i < 3; i++ {
		chs[i] = make(chan int)
		go Add(chs[i], i, i)
	}

	for _, ch := range chs {
		<-ch
	}
}

默认的编译会给调试带来困难,请带上指定参数go build -gcflags "-N -l"
go build -gcflags "-N -l" test.go


进入gdb
gdb test


查看源码
(gdb) l test.go:10            //列出指定的文件与行号,默认10行


设置断点, delete命令可用来删除断点:
(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)     //从断点开始继续执行


golang通过gdb的扩展机制,来扩展了一些有用的命令,这将会给调试带来帮助
(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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: