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
输出变量或者数组: p 变量名/*数组名@长度
自动显示变量: 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 程序名 转储文件名; //定位