gdb简介
- GDB是GUN开源组织发布的一个强大的UNIX下的程序调试工具。或许,平时大家更加习惯图形界面的调试,比如VS上的IDE调试;但是如果我们在UNIX或Linux下做软件,我们呢就更加需要熟练GDB这个调试工具。
- GDB调试使用的是DEBUG版本的,而使用gcc或者g++默认生成的可执行文件为release版本,所以在生成可执行文件时,我们需要在命令的尾部加上 -g,这样就可以生成的是DEBUG版本下的可执行文件。
gdb调试代码的基本常用命令
命令 |
作用 |
list或l+行号 |
显示从行号开始的源代码(缺省为10行,下面都是) |
list或l+行号 |
显示某个函数的源代码 |
run或r |
运行程序 |
step或s |
单步执行,遇到函数进入 |
next或n |
单步执行,遇到函数不进入 |
break或b + 行号 |
在某一行设置断点 |
break + 函数名 |
在某个函数开头设置断点 |
info break或i b |
查看断点信息 |
d + 断点序号 |
删除序号为n的断点 |
finish或f |
执行到当前函数返回,然后停下来等待命令 |
print或p + 变量名 |
打印变量的值 |
whatis + 变量名 |
查看变量类型 |
gdb调试多进程
- 在默认情况下是调试多进程程序时GDB会默认调试主进程,但是GDB支持多进程的分别与同步调试。即GDB支持同时调试多个进程,只需要设置follow-fork-mode(默认为parent)和detach-on-fork(默认为on)即可。我们还可以使用catch fork指令,如果fork异常,会停止程序。
- 显示follow-fork-mode信息
show follow-fork-mode
show detach-on-fork
follow-fork-mode |
detach-on-fork |
说明 |
parent |
on |
只调试父进程(gbb)默认 |
child |
on |
只调试子进程 |
parent |
off |
同时调试两个进程,gdb跟主进程,子进程block(阻塞)在fork位置 |
child |
off |
同时调试两个进程,gdb跟子进程,主进程block在fork位置 |
- 设置follow-fork-mode和detach-on-fork方法
set follow-fork-mode [child]/[parent] //设置为child或者parent
set detach-on-fork [on]/[off]//设置为on或off
gdb调试多线程
- GDB默认支持调试多线程,跟主线程,子线程阻塞在create thread。
- gdb调试一般有两种模式:all-stop模式和no-stop模式(gdb7.0之前不支持no-stop模式)。
- all-stop:在这种模式下,当你的程序在gdb由于任何原因而停止,所有的线程都会停止,而不仅仅是当前的线程。
- no-stop:当程序在gdb中停止,只有当前的线程会被停止,而其他线程将会继续运行。
- 打开 no-stop方法:vim ~/.gdbinit
命令 |
作用 |
info threads |
显示所有可调试的线程 |
thread ID |
切换到指定线程,gdb为每一个线程分配一个ID(与tid不同),编号一般从1开始 |
set scheduler-locking off/on/step |
off表示不锁定任何线程,on表示只有当前调试的线程会继续运行,step表示在单步执行时只有当前线程会运行 |
show scheduler-locking |
显示当前模式 |