代码改变世界

GDB 调试Golang常用命令及方法(备忘)

2013-01-11 11:51  Danny.tian  阅读(5880)  评论(0编辑  收藏  举报

gdb [options] --args executable-file [inferior-arguments ...]

  • l - 相当于list命令,l 37 显示37行附近的源码
  • b 行号,b 37 if i==3
  • b 函数名.函数名
  • i b - 查看全部断点信息
  • d - 删除所有断点
  • d 0 - 删除第0个断点
  • display a - 一直显示a的值
  • undisplay - 去掉所有显示
  • watch addr - 监控addr内存
  • s - step的意思进入函数进行跟踪
  • j 37 - 直接跳到37行运行
  • u - 将循环执行完
  • p a - 打印a的值
  • p a=3 - 设置a的值,p (*(mystruct *)addr) 打印一个数据结构,addr为其地址
  • r - 运行程序到断点
  • n - next的意思继续执行下一条语句
  • c - continue的意思,继续执行跳过当前断点, c 3 忽略3次断点
  • bt - 查看函数堆栈
  • where - 查看堆栈信息
  • up - 回溯一层堆栈
  • down - 到下一层堆栈
  • shell - 进入shell,如果再exit会回到gdb, shell echo $env
  • enable n - 开启第n个断点
  • disable n - 禁用第n个断点
  • finish - 执行本函数并返回
  • dir - 加目录

 

关闭GDB时,发现未退出应用程序:

a. 查找被占用的端口
netstat -tln
netstat -tln | grep 8060
netstat -tln 查看端口使用情况,而 netstat -tln | grep 8060 则是只查看端口8060的使用情况
b. 查看端口属于哪个程序?端口被哪个进程占用
lsof -i:8060

lsof -i:9000
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
revel 24739 yourihua 8u IPv6 576421 0t0 TCP *:9000 (LISTEN)

c.杀掉占用端口的进程 根据pid杀掉

kill -9 进程id
kill -9 24739

 

目的:使用gdb附加到一个正在运行的进程上,然后做一些调试,并安全退出。

1. 修改Ubuntu配置,允许gdb附加到进程上,如何修改如下:
http://askubuntu.com/questions/41629/after-upgrade-gdb-wont-attach-to-process

2. 查看进程id #ps ax 或者 #ps au

3. 启动gdb

4. 使用file命令来指定进程所联系的程序源代码和符号表,例如:

file 要附加的源代码目录

5. attach <进程ID>

6. 打断点,如下:

b path/to/app.go:10

7. 输入c,进程继续运行。

8. ctrl + c再次中断,回到gdb命令行,然后输入:deatch。
当你调试结束之后,可以使用该命令断开进程与gdb的连接(结束gdb对进程的控制),在这个命令执行之后,你所调试的那个进程将继续运行。