GDB使用总结

http://witmax.cn/gdb-usage.html

 

首先GDB可以自动化调试,但是我不会

 

首先编译的时候要加上 -g选项

 

分屏使用GDB:  gdb  -tui

 

 

 

GDB中加载程序 :                        file  文件名

 

设置参数:                                  set args 参数

 

设置观察点(当有变化就停下):               watch 表达式/变量名

 

清除停止点:                                clear  行号/函数名

 

加断点:    b  行号/函数名

 

输出内存:  x  addr

 

单步调试: s(不进入函数) / n(进入函数)

 

打印堆栈:                                  bt

 

显示源码:                             l  行号/函数名

 

修改默认的listsize:                          set listsize count

 

输出变量或者数组:                          变量名/*数组名@长度

 

自动显示变量: display 变量名

 

查看寄存器: i  r

 

改变程序运行:

 

 

GDB调试多线程

默认调试多个线程。多个线程同时执行,

使用“info threads”查看当前的线程数和线程的线程号。

使用“thread 线程号”可以切换线程。

使用单步调试的话走的是当前线程,但是也可以在其他线程的函数里设置断点。

因为进行多线程调试的时候使用s或者c或者所有线程是同步执行的,如果只想让当前进程被执行可以使用“set scheduler-locking off|on|step on只有当前被调试程序会执行,step是在单步的时候,除了next过一个函数外,只有当前线程会执行,off是所有线程都执行。

GDB调试多进程

默认调试的是主进程,但是其他的进程会在后台执行,不被调试的进程会后台执行。

可以通过“set follow-fork-mode [parent|child]   set detach-on-fork [on|off]”来让GDB同时调试多个进程。其中参数如下:

parent                   on               只调试主进程(GDB默认)
child                     on               只调试子进程
parent                   off              同时调试两个进程,gdb跟主进程,子进程block在fork位置
child                     off             同时调试两个进程,gdb跟子进程,主进程block在fork位置

 

查询正在运行的进程:info inferiors

切换调试的进程:    inferior <infer number>

GDB调试core dump

使用GDB确定程序挂在哪里,我们只需要四步:

Ulimit -c unlimited //设置可以生成转储文件

Gcc -g 文件名 -o 程序名; //生成转储文件

Gdb 程序名 转储文件名; //定位





posted @ 2016-03-08 20:04  DChipNau  阅读(780)  评论(0编辑  收藏  举报