linux下GDB调试器的使用
调试(debug)
一个程序生成可执行文件之后,就会进入程序的调试环节,对于一些小程序,有些不用调试就能看出问题,而当程序扩大到几千几万行,这个时候,调试就显得重中之重了。所以聪明的程序猿们给所有的程序 都配上了一套完整的装备,在linux操作系统最为出色的就是GDB调试器了,话不多说让我们一起跑起来!
- 创建一个循环(为了能看起来明显,尽量多循环几次)
#include <stdio.h>
int main()
{
int i ,j = 1;
for(i = 1; i <= 10; i++)
{
j *= i;
printf("factorial i =%d\n",i,j);
}
return 0;
}
一个很简单的求阶乘的程序,我们从它入手做调试,
首先直接运行的结果是这样的
- 接下来我们进入GDB
进入GDB只需要gdb 加上可执行文件就行了,这里注意要使用gdb调试器的可执行文件一定要在编译的时候加上-g ,不然在用很多gdb调试指令时候会无法使用并提示No symbol table is loaded. Use the “file” command.
gcc -g GDB.c -o GDB
gdb GDB
在进入后会出现你的ubuntu安装的gdb的版本信息
,进入gdb指令行,在(gdb)后面加上 run开始运行程序
-
显示代码
用(gdb)l或者list显示文件,根据ubuntu配置不同也会一次显示不同的行数(比如我就一次显示的10行) -
设置断点
(gdb)b加行号设置断点,断点可以设置很多个。
设置完断点后,可以用(gdb)info b 来查看断点,断点设置情况会打印在屏幕上 -
run运行
终于来到了最重要的一步,这一步做好了将带我们走向人生巅峰,兄弟们做好准备:
(gdb)run 运行程序,在这里就可以观察程序走向,程序在断点之前就会停下来,断点的那一行并不运行。
用(gdb)p j查看变量j当前值,或者用display j一直查看j的值
发现 j 的值为1,而第一次运行没有进入循环的 j 的初值也的确为1,完全吻合,接下来就可以(gdb)next 进行一行一行的运行了,如果遇到涉及到变量值改变的运算时,就可以用 p 加变量名查看当前值。如果懒得一次一次输入next的话(懒不一定是坏事,只要懒到了点,也便成了智[]( ̄▽ ̄)*),直接用(gdb)c
(continue的意思),程序就会运行到程序结束或者下一个断点前停止啦,如果没有设置其他断点,程序直接运行到结束。
-
step进入函数
遇到函数的时候,最好在进入函数的时候设置断点,用step命令进入函数 -
退出gdb
如果想退出gdb调试器,直接(gdb)q 或者CTRL+z直接结束进程(不是特别时候不建议使用)。到此调试的一般流程就到此结束,其他的指令例如break、
clear等等可以在Ubuntu 中man gdb 或者翻阅资料或手册了解。
(很多初学者不喜欢调试,觉得太麻烦,但是掌握调试后才能更加容易的解决遇到的一些未知问题,才能多一种趣味,共勉吧!)
! ------来自一个奋斗的猿!