Linux下调试函数-----gcc与gdb的使用

这篇博文主要讲下如何编写程序并使用gdb调试段错误(core dump)

 

何为gdb?---百度百科

UNIXUNIX-like下的调试工具。或许,各位比较喜欢那种图形界面方式的,像VCBCBIDE的调试,但如果你是在UNIX平台下做软件,你会发现GDB这个调试工具相比于VCz的优点是具有修复网络断点以及恢复链接等功能。BCB的图形化调试器更强大的功能。所谓寸有所长,尺有所短就是这个道理。

 

GDB四个方面的功能:

1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。

2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式

3、当程序被停住时,可以检查此时你的程序中所发生的事。

4、你可以改变你的程序,将一个BUG产生的影响修正从而测试其他BUG


在我们编写完程序之后呢,假装我们想要调试,那么该如何进入gdb模式呢。?文件名是test.c
gcc -g test.c -o test     //-g 为调试选项  -o 为写入文件
gdb test                       //进入gdb模式


Linux下调试函数-----gcc与gdb的使用_第1张图片


这时候的我们就进入了gdb模式,这时候不得不提一下gdb模式下的些许操作选项

 
  
list (l)                   列出源代码 后面加上行号可从该行开始显示
break (b) 42        在42行设置断点
b 函数名             在函数处设置断点
info break (i b)    显示断点信息
delete i (d i)        删除断点
run (r)                 开始执行
next (n)              单步执行不进入函数,相当于F10
s                        进入函数 F11
print 变量i (p i)   打印变量的值 b 行号
if(i==9)               第几行的断点,在运行到i==9的时候停止
backtrace (bt)    显示函数调用栈的关系
what is i             i是什么类型
enter                  重复上一步操作
finish                 结束函数
q                       退出gdb模式
PS:括号里面皆为首字母,相同含义。

举个有bug的栗子:文件名  test.c

1 #include

  2 int main()

  3 {

  4     int a;

  5     printf("please enter num:");

  6     scanf("%d", a);//很明显这里没有加取址符&

  7     printf("%d", a);

  8     system("pause");

  9     return 0;

 10 }


然后呢,开始调试:
gcc -g test.c -o test     //-g 为调试选项  -o 为写入文件
file test           //file指令可以看见此时的test已变成ELF格式的可执行文件
./test              //运行程序,然后报core dump段错误
ls                  //打开目录查看段错误

Linux下调试函数-----gcc与gdb的使用_第2张图片


ulimit -a//显示当前各进程的限制,可见core文件大小限制等于0

ulimit -c unlimited//设置成无穷大

ulimit -c  //查看是否设置成功,成功显示unlimited

file core.4798  //假装查看名为4798的段错误文件

Linux下调试函数-----gcc与gdb的使用_第3张图片



gdb ./test core.4798//开始调试,此时可以看到哪块地方程序崩溃掉的


Linux下调试函数-----gcc与gdb的使用_第4张图片

然后我们就知道是这个scanf函数发生的毛病,在添加取址符&之后就可以运行程序啦。。

你可能感兴趣的:(Linux)