我们以一个简单的程序进行调试
void fun(char* arr,int len)
{
int i;
for(i=0;i<=len;i++)
{
printf("%d",arr[i]);//这里返回类型应该是%C这要是为了调试
}
}
int main()
{
char arr[10]="0123456789";//没有地方放入'\0'导致出现问题
int len=strlen(arr);
fun(arr,len);
reruen 0;
}
结果一运行结果跟我们想像的不一样照理说应该说是0-9,运行结果如下
然后我们接下来进行进行调试
[fcx@localhost cy1704]$ gcc -o text text.c -g ------》编译成执行文件记得后面加-g
[fcx@localhost cy1704]$ gdb text -------》进行调试
GNU gdb (GDB) Red Hat Enterprise Linux (7.2-56.el6)
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "i686-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/fcx/Desktop/cy1704/text...done.
(gdb) l ------》list的简写,用来查看源码
5 {
6 int i;
7 for(i=0;i<len;i++)
8 {
9 printf("%d\n",arr[i]);
10 }
11 }
12 int main()
13 {
14 char arr[10]="0123456789";
(gdb) ------》敲回车键,表示执行上一个命令,这里执行的还是l,为了把源码看全
15 int len=strlen(arr);
16 fun(arr,len);
17 return 0;
18 }
(gdb) b 14 ------》在14行下断点
Breakpoint 1 at 0x8048437: file text.c, line 14.
(gdb) r ------》启动调试
Starting program: /home/fcx/Desktop/cy1704/text
Breakpoint 1, main () at text.c:14
14 char arr[10]="0123456789";
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.80.el6.i686
(gdb) display len -------》把len加入到展台(就是vs的监视窗口)
1: len = 11710452
(gdb) n ------》执行下一行
15 int len=strlen(arr);
1: len = 11710452
(gdb) n
16 fun(arr,len);
1: len = 13 //这里发现和我们预想的长度10不一样,我们可通过源码发现,是数组初始化时出错
(gdb) s -------------》进入函数中
fun (arr=0xbffff322 "0123456789\r", len=13) at text.c:7
7 for(i=0;i<len;i++)
(gdb) display i ------------》把i加入展台
2: i = 10599280 //此时没有初始化
(gdb) n
9 printf("%d\n",arr[i]);
2: i = 0 -----》i值为0
(gdb) display arr[i] -------》加入展台
3: arr[i] = 48 '0' -----------》发现输出值为48但是字符值为‘0’,所以可看出是输出格式有了问题
(gdb) finish --------》退出函数执行
Run till exit from #0 fun (arr=0xbffff322 "0123456789\r", len=13) at text.c:9
49
50
51
52
53
54
55
56
57
13
0
0
main () at text.c:17
17 return 0; -----》执行点跑到了这
1: len = 13
(gdb) q --------》推出调试
A debugging session is active.
Inferior 1 [process 10917] will be killed.
Quit anyway? (y or n) y ---->键入y
[fcx@localhost cy1704]$
最后在总结下一些常用的gdb调试命令