1. 很早之前写过GDB调试简单Go程序的文章,没有带命令行参数,最近再看一个开源项目需要用到带命令行参数的调试。
如下:
查看帮助得到如下:
gdb [options] --args executable-file [inferior-arguments ...]
例如:
gdb --args revel run github.com/yourihua/console
2. 载入 Go Runtime:
source /home/yourihua/go/src/pkg/runtime/runtime-gdb.py
或者在添加文件 ~/.gdbinit,内容如下:
add-auto-load-safe-path ~/go/src/pkg/runtime/
3. 如果需要将断点打在非main包上,使用 b package.func 会出现如下提示:
Make breakpoint pending on future shared library load? (y or [n])
这时候只能使用 b filename:line 了,而且需要完整路径,例如:
(gdb) b /home/yourihua/workplace/rhino/src/github.com/robfig/revel/revel.go:81 Breakpoint 1 at 0x44eeaf: file /home/yourihua/workplace/rhino/src/github.com/robfig/revel/revel.go, line 81.
为了避免每次都输入完整路径,可以用dir添加搜索路径,如下:
(gdb) dir /home/yourihua/workplace/rhino/src/github.com/robfig/revel/ Source directories searched: /home/yourihua/workplace/rhino/src/github.com/robfig/revel:$cdir:$cwd (gdb) b revel.go:86 Breakpoint 2 at 0x44ef60: file /home/yourihua/workplace/rhino/src/github.com/robfig/revel/revel.go, line 86.
4. 不错的文章:Introduction to Go Debugging with GDB,地址:http://lincolnloop.com/blog/2012/oct/3/introduction-go-debugging-gdb/
5. 关闭GDB时,发现未退出应用程序:
a. 查找被占用的端口
netstat -tln
netstat -tln | grep 8060
netstat -tln 查看端口使用情况,而 netstat -tln | grep 8060 则是只查看端口8060的使用情况
b. 查看端口属于哪个程序?端口被哪个进程占用
lsof -i:8060
yourihua@ubuntu:~$ lsof -i:9000 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME revel 24739 yourihua 8u IPv6 576421 0t0 TCP *:9000 (LISTEN) yourihua@ubuntu:~$
c.杀掉占用端口的进程 根据pid杀掉
kill -9 进程id
kill -9 24739
最后,感谢yuhen的热心帮助。
有疑问加站长微信联系(非本文作者)