mac下用gdb调试Go程序
kenshin · · 5667 次点击 · · 开始浏览安装gdb
MAC OS X安装Xcode时,会带一个6.x版本的gdb,只支持DWARF2。 而Go的编译文件默认是包含 DWARFv3 调试信息,因此需要升级gdb版本到7.1或以上。 安装步骤:
1 2 3 4 5 6
$ curl -O http://ftp.gnu.org/gnu/gdb/gdb-7.3.1.tar.gz
$ tar -xzf gdb-3.7.1.tar.gzma
$ cd gdb-7.3.1
$ ./configure
$ make
$ [sudo] make install 通过上面的步骤安装完后,gdb7.3 会安装到/usr/local/bin/gdb,原来的gdb 6.x在/usr/bin/gdb。
这个时候直接执行gdb,默认使用的还是gdb 6.x(依赖于你的$PATH设置)。如果想显示调用gdb 7.3就得使用绝对路径,
/usr/local/bin/gdb 。因为我需要用Xcode调试iOS程序,所以要保证gdb 6.x依然可用,否则可以用/usr/local/bin/下的gdb
替换/usr/bin下面的,这样每次调用就不需要使用绝对路径了。
剩下的事情就和操作系统无关了。
使用步骤
1 . 编译
1
$ go build -gcflags "-N -l" test.go 关闭内联优化,便于输出调试信息2 . 进入gdb环境
1
$ sudo /usr/local/bin/gdb test //默认的gdb是6.X版本,因此要指定路径3 . 载入golang运行时支持
1
(gdb) source /usr/local/go/src/pkg/runtime/runtime-gdb.py4 . gdb下一些调试命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
(gdb) l main.main #查看源代码代码
(gdb) b 50 #设置断点
(gdb) info b #查看断点信息
Num Type Disp Enb Address What
1 breakpoint keep y 0x0000000000002239 in main.main at /Users/kenshin/workspace/gogo/test.go:50
(gdb) run #运行,直到触发断点中断
(gdb) n #继续执行下一行
(gdb) s #进入函数/方法
(gdb) info locals #查看局部变量ma
err = {tab = 0x0, data = 0xc2000bdfc0}
(gdb) info args #查看参数
s = 0xc2000b6f00
addr = "0.0.0.0:8000"
(gdb) help info
(gdb) p addr #打印变量
6ドル = "0.0.0.0:8000"
(gdb) c #继续执行,直到下一个断点
(gdb) whatis s #查看变量类型
type = struct github.com/hoisie/web.Server *
(gdb) where/bt #查看堆栈信息,判断函数调用关系
#0 net.resolveInternetAddr (net="udp4") at /usr/local/go/src/pkg/net/ipsock.go:164
#1 in net.ResolveUDPAddr (net="udp4") at /usr/local/go/src/pkg/net/udpsock.go:45
#2 in main.SocketListen (ip="127.0.0.1") at /Users/kenshin/workspace/gor/test.go:13
(gdb) up #回到上一层调用函数
#0 in net.ResolveUDPAddr (net="udp4") at /usr/local/go/src/pkg/net/udpsock.go:45
#1 in main.SocketListen (ip="127.ma0.0.1") at /Users/kenshin/workspace/gor/test.go:13
(gdb) down #再进入下一层函数
#0 net.resolveInternetAddr (net="udp4") at /usr/local/go/src/pkg/net/ipsock.go:164
#1 in net.ResolveUDPAddr (net="udp4") at /usr/local/go/src/pkg/net/udpsock.go:45
#2 in main.SocketListen (ip="127.0.0.1") at /Users/kenshin/workspace/gor/test.go:13
(gdb) shell #输入shell,可以进入到shell,输入exit退出shell回到gdb环境
bash-3.2# exit有一点需要特别说明的: gdb对slices, arrays 和 strings这些golang的数据类型支持不是很好,例如p str显示的是一个map类型的数据
1 2 3 4 5 6
(gdb) p r # r string := "process"
16ドル = {str = 0x2f0170 "process", len = 7}
(gdb) p r-> #可以通过`TAB`获得一些提示
len str
(gdb) p r->str
17ドル = (uint8 *) 0x2f0170 "process"现在直接通过gdb来调试golang还不是非常好用,输出的调试信息阅读困难,goroutine内的栈信息更是没法跟踪。
现在围绕go的开源项目这么多,希望很快就会有类似ipdb这样的东西出来。
更多gdb命令参考 :http://golang.org/doc/gdb
有疑问加站长微信联系(非本文作者)
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
关注微信- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码` - 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传
收入到我管理的专栏 新建专栏
安装gdb
MAC OS X安装Xcode时,会带一个6.x版本的gdb,只支持DWARF2。 而Go的编译文件默认是包含 DWARFv3 调试信息,因此需要升级gdb版本到7.1或以上。 安装步骤:
1 2 3 4 5 6
$ curl -O http://ftp.gnu.org/gnu/gdb/gdb-7.3.1.tar.gz
$ tar -xzf gdb-3.7.1.tar.gzma
$ cd gdb-7.3.1
$ ./configure
$ make
$ [sudo] make install 通过上面的步骤安装完后,gdb7.3 会安装到/usr/local/bin/gdb,原来的gdb 6.x在/usr/bin/gdb。
这个时候直接执行gdb,默认使用的还是gdb 6.x(依赖于你的$PATH设置)。如果想显示调用gdb 7.3就得使用绝对路径,
/usr/local/bin/gdb 。因为我需要用Xcode调试iOS程序,所以要保证gdb 6.x依然可用,否则可以用/usr/local/bin/下的gdb
替换/usr/bin下面的,这样每次调用就不需要使用绝对路径了。
剩下的事情就和操作系统无关了。
使用步骤
1 . 编译
1
$ go build -gcflags "-N -l" test.go 关闭内联优化,便于输出调试信息2 . 进入gdb环境
1
$ sudo /usr/local/bin/gdb test //默认的gdb是6.X版本,因此要指定路径3 . 载入golang运行时支持
1
(gdb) source /usr/local/go/src/pkg/runtime/runtime-gdb.py4 . gdb下一些调试命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
(gdb) l main.main #查看源代码代码
(gdb) b 50 #设置断点
(gdb) info b #查看断点信息
Num Type Disp Enb Address What
1 breakpoint keep y 0x0000000000002239 in main.main at /Users/kenshin/workspace/gogo/test.go:50
(gdb) run #运行,直到触发断点中断
(gdb) n #继续执行下一行
(gdb) s #进入函数/方法
(gdb) info locals #查看局部变量ma
err = {tab = 0x0, data = 0xc2000bdfc0}
(gdb) info args #查看参数
s = 0xc2000b6f00
addr = "0.0.0.0:8000"
(gdb) help info
(gdb) p addr #打印变量
6ドル = "0.0.0.0:8000"
(gdb) c #继续执行,直到下一个断点
(gdb) whatis s #查看变量类型
type = struct github.com/hoisie/web.Server *
(gdb) where/bt #查看堆栈信息,判断函数调用关系
#0 net.resolveInternetAddr (net="udp4") at /usr/local/go/src/pkg/net/ipsock.go:164
#1 in net.ResolveUDPAddr (net="udp4") at /usr/local/go/src/pkg/net/udpsock.go:45
#2 in main.SocketListen (ip="127.0.0.1") at /Users/kenshin/workspace/gor/test.go:13
(gdb) up #回到上一层调用函数
#0 in net.ResolveUDPAddr (net="udp4") at /usr/local/go/src/pkg/net/udpsock.go:45
#1 in main.SocketListen (ip="127.ma0.0.1") at /Users/kenshin/workspace/gor/test.go:13
(gdb) down #再进入下一层函数
#0 net.resolveInternetAddr (net="udp4") at /usr/local/go/src/pkg/net/ipsock.go:164
#1 in net.ResolveUDPAddr (net="udp4") at /usr/local/go/src/pkg/net/udpsock.go:45
#2 in main.SocketListen (ip="127.0.0.1") at /Users/kenshin/workspace/gor/test.go:13
(gdb) shell #输入shell,可以进入到shell,输入exit退出shell回到gdb环境
bash-3.2# exit有一点需要特别说明的: gdb对slices, arrays 和 strings这些golang的数据类型支持不是很好,例如p str显示的是一个map类型的数据
1 2 3 4 5 6
(gdb) p r # r string := "process"
16ドル = {str = 0x2f0170 "process", len = 7}
(gdb) p r-> #可以通过`TAB`获得一些提示
len str
(gdb) p r->str
17ドル = (uint8 *) 0x2f0170 "process"现在直接通过gdb来调试golang还不是非常好用,输出的调试信息阅读困难,goroutine内的栈信息更是没法跟踪。
现在围绕go的开源项目这么多,希望很快就会有类似ipdb这样的东西出来。
更多gdb命令参考 :http://golang.org/doc/gdb