什么是GDB
GDB(GNU Debugger)是GNU组织发布的代码调试工具。可以在win、linux、mac os下使用。
本文记录gdb在日常开发中常用命令和常用用法。
想要使用gdb调试代码,那么编译代码的时候必须带-g选项,让目标代码中携带调试信息,否则不能使用gdb调试。这是前提条件。
如何使用gdb调试一个程序。
man手册给出了三种方法:
第一种:调试可执行文件,gdb program,也就是gdb + 目标文件,比如调试目标文件名test的程序:gdb test
第二种:调试core文件,gdb program core,也就是 gdb + 目标文件 + core文件。 比如:gdb test core。 当程序出现段错误的时候可以用这种方法取调试。可以直接定位到段错误的地点。
举个例子:
#include<stdio.h>
int main(int argc,char **argv)
{
int i = 0;
int *pbuffer = NULL;
*pbuffer = i;
return 0;
}
pbuffer
指针的值是NULL
,当我们给pbuffer
赋值的时候就会引发段错误,编译程序得到test目标文件。执行程序会报“段错误 (核心已转储)”错误,同时得到一个名为core的文件。再执行命令 gdb test core 去调试程序,如下图:
直接指出了代码是在第几行引发的段错误,直接把行数都提示出来了,太牛了。例子中的测试程序一眼就能看到问题,但是当程序特别大的时候,就不容易看出,而使用gdb调试core文件定位段错误是一种不错的方法。
如果没有得到core文件怎么办
很可能是资源受限制了,用 ulimit -a 命令查看一下受限制的资源。
jack@jack-virtual-machine:~/C$ ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 31574
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 31574
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
再执行命令ulimit -c unlimited 设置为core file size 不受限。 就可以得到core文件了。
-c设置core file size,-d 设置 data seg size。上边的代码能看出使用 -c 选项。
第三种:调式一个正在运行的程序,后台方式运行一个程序,然后通过进程号去调式,执行命令 gdb -p 进程号。
gdb常用命令:
其实gdb 最常用的命令就10个左右吧。
run 命令,简写 r,功能是启动程序。
break命令,简写b,功能是设置断点,最常用的有两种设置断点的方法:
第一种是通过行号设置断点,比如:b 6 是在第6行设置断点,但是有个疑问是在哪个文件的第6行设置断点呢,因为我们要调试的程序往往有若干个文件,答案是在程序正在运行的文件内设置断点。不过最好不要这样写,而是明确的指出在哪个文件的第几行设置断点。如下图
第二种是通过函数设置断点,b 函数名,比如:b out_put_array
是在函数内部的第一行设置断点。
delete命令,简写d,删除断点,比如:d 2 就是删除第2个断点。
disable命令:禁用断点 ,比如:disable 2 就是禁用第二个断点。
continue 命令,简写c,功能是继续全速运行程序,当程序遇到断点,或在单步执行的时候,c 命令会让程序全速跑起来。
list命令,简写 l,列出代码。和break命令类似,是从哪个文件的第几行列出代码。
print 命令,简写p,打印变量的值,或其它信息。这个可能是最常用的命令之一,
step 命令,跳进某一个函数执行。 注意step 跳进去就会执行,只到遇到断点。
help命令,help加命令就可以查看gdb命令的帮助信息。
暂且先记录这么几个命令吧。
注意:在gdb中可以调用shell 命令,比如: