一、gdb调试
1、创建一个文件夹test:[root@localhost zhaoh]# mkdir test
2、编写水仙花的文件:[root@localhost zhaoh]# vim shuixianhua.c
代码程序的内容:
1 #include <stdio.h>
2 int main()
3 {
4 int m,a,b,c;
5 printf("水仙花:\n");
6 for(m=100;m<=999;m++)
7 {
8 a=m/100;b=m/10%10;c=m%10;
9 if(m==a*a*a+b*b*b+c*c*c)
10 printf("%4d\n",m);
11 }
12 }
3、编译文件[root@localhost test]# cc shuixianhua.c
生成a.out文件
4、执行文件:
[root@localhost test]# ./a.out
水仙花:
153
370
371
407
5、调试文件:gdb a.out
6、开始调试:
1、list 1//从第一行开始分页显示源程序,每页10行,按回车键显示下一页。
(gdb) list 1
1 #include <stdio.h>
2 int main()
3 {
4 int m,a,b,c;
5 printf("水仙花:\n");
6 for(m=100;m<=999;m++)
7 {
8 a=m/100;b=m/10%10;c=m%10;
9 if(m==a*a*a+b*b*b+c*c*c)
10 printf("%4d\n",m);
(gdb)
11 }
12 }
2、break 17 //在第17行处创建断点。
(gdb) break 9
Breakpoint 2 at 0x80484ab: file shuixianhua.c, line 9.
3、info break //显示断点信息。
(gdb) info break
Num Type Disp Enb Address What
1 breakpoint keep y 0x080484e2 in main at shuixianhua.c:10
breakpoint already hit 2 times
2 breakpoint keep y 0x080484ab in main at shuixianhua.c:9
4、run //从头开始执行程序,将执行到断点处暂停,显示断点处语句。
continue //继续执行程序,将执行到断点处暂停,显示断点处语句。
(gdb) run
The program being debugged has been started already.
Start it from the beginning? (y or n) y
Starting program: /home/zhaoh/test/a.out [args]
水仙花:
Breakpoint 2, main () at shuixianhua.c:9
9 if(m==a*a*a+b*b*b+c*c*c)
(gdb)
(gdb) continue
Continuing.
5、print sum //显示变量sum的值。
(gdb) print m
$7 = 103
(gdb) print a
$8 = 1
(gdb) print b
$9 = 0
(gdb) print c
$10 = 3
6、print factorial(4) //显示调用函数语句factorial(4)的结果。
7、step //逐条语句执行程序,将进入到函数factorial中执行。
(gdb) step6
for(m=100;m<=999;m++)
8、next //逐条语句执行。
(gdb) next8
a=m/100;b=m/10%10;c=m%10;
9、whatis s //显示变量s的类型。
(gdb) whatis a
type = int
(gdb) whatis m
type = int
10、bt //显示函数的调用关系。
11、finish//结束函数factorial的执行,显示函数factorial的返回值。
12、help //显示GDB命令的分类和功能描述。
13、help data//显示data类命令及其功能描述。
14、disable 1 //使断点1失效。
15、continue //继续执行程序,直到结束。
16、quit //退出GDB环境。
(gdb) continue
Continuing.
Breakpoint 2, main () at shuixianhua.c:9
9 if(m==a*a*a+b*b*b+c*c*c)
(gdb) quit
A debugging session is active.
Inferior 1 [process 5172] will be killed.
二、make调试
1、a.c文件和a1.c文件
a.c
#include <stdio.h>
int factorial(int);
int main(){
int sum=0,x;
for(x=6;x<=10;x++)
{
sum=sum+factorial(x);
}
printf(“sum=%d\n”,sum);
return 0;
}
a1.c:
int factorial( int h)
{int k,s=1;
for(k=1;k<=h;k++)
{
s=s*k;
}
return s;
}