golang gdb调试教程
2016-01-17 00:00
483 查看
gdb允许你调试已经编译好的二进制文件, 它提供了一个交互终端,使你无需修改源代码,来调试程序.
gdb基础命令:
以如下测试代码为例:
默认的编译会给调试带来困难,请带上指定参数go build -gcflags "-N -l"
进入gdb
查看源码
设置断点, delete命令可用来删除断点:
执行,显示本地变量、实参与返回值的栈帧上的名字、类型与位置
调试过程(调试信息过长,就不贴了)
golang通过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
相关文章推荐
- 初识DragonBoard 410c
- django如何在 search_fields 中包含外键字段
- django - form
- django 前台-后台传输数据
- django views显示中文
- django后台页面标题定制
- django中配置markdown
- GoLang环境搭建
- Windows 环境里下载及安装 GO
- Go语言学习笔记(4)复合类型
- django 中配置 static
- ubuntu 13.10 64位安装及配置 google拼音输入法及Adobe flash player、mp3 插件安装、中文GBK编码等 -转
- mgo使用指南-高级篇(长连接/重连)
- Codeforces 598D Igor In the Museum (dfs)
- django model的get和filter方法的区别
- django初始化设置
- Django framework
- Golang初级系列教程-接口
- golang(2):beego 环境搭建
- HDU 4981 Goffi and Median(水)