gdb的简单调试过程(常用的命令)

我们以一个简单的程序进行调试

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调试命令

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值