Linux下C程序的编辑,编译和运行以及调试

这篇文章讲解的是如何用vim编辑器和gdb调试程序

转载:http://www.cnblogs.com/AloneSword/p/3512797.html
要使用的工具:
编辑:vim(vi)
编译和运行:gcc
调试:gdb

安装很简单(以下是以在CentOS中安装为例):
1 yum vim gcc gdb

1.使用vim编辑源文件
首先,打开终端练下手:
1 vim hello.c

(进入一般模式)
按下”i”,进入编辑模式,在编辑模式下输入:
1 #include

注意:这里的 1gdb 后面的编号会自动增长,在命令中可以用 1 2、$3等编号代替相应的值。

以上的执行过程使用下面的方法可能看得更清楚(这里的步骤不是继续跟着上面步骤,是在另一个终端中调试的):
01 (gdb) f 0
02 #0 add_range (low=1, high=10) at test1.c:7
03 7 sum = sum + i;
04 (gdb) i locals
05 i = 1
06 sum = 0
07 (gdb) s
08 6 for(i = low; i <= high; i++){
09 (gdb) i locals
10 i = 1
11 sum = 1
12 (gdb) s
13 7 sum = sum + i;
14 (gdb) i locals
15 i = 2
16 sum = 1
17 (gdb) s
18 6 for(i = low; i <= high; i++){
19 (gdb) i locals
20 i = 2
21 sum = 3


由此看出,第一次循环的结果是正确的,再往下单步调试已经没有意义了,可以使用finish命令让程序一直运行到从当前函数返回为止:
1 (gdb) finish
2 Run till exit from #0 add_range (low=1, high=10) at test1.c:6
3 0x0000000000400507 in main () at test1.c:14
4 14 result[0] = add_range(1, 10);
5 Value returned is $1 = 55

返回值是55,当前正准备执行赋值操作,用s命令执行赋值操作,然后查看result数组:
01 (gdb) s
02 15 result[1] = add_range(1, 100);
03 (gdb) print result
04 $2 = {55, 0, -1646196904, 50, 4195016, 0, 0, 1, 2041, 1, -1654612390, 50, 0, 0,
05 -1652419360, 50, -7728, 32767, -7688, 32767, -1652420216, 50, -134227048,
06 32767, -163754450, 0, -1654612390, 50, 0, 0, -134227048, 32767, 1, 0, 0, 0,
07 1, 50, -1652420216, 50, -7848, 32767, 750006344, 0, 6, 0, -7826, 32767, 0, 0,
08 -1652419360, 50, -7808, 32767, -1645672825, 50, -7784, 32767, 0, 1, 0, 0,
09 4195073, 0, 191, 0, -7826, 32767, -7825, 32767, 1, 0, 0, 0, -1645672168, 50,
10 0, 0, 4195680, 0, 0, 0, 4195235, 0, -7512, 32767, 4195749, 0, -1646199904,
11 50, 4195680, 0, 0, 0, 4195296, 0, -7536, 32767, 0, 0}

第一个值是55确实赋值给类result数组的第0个元素。

使用s命令进入第二次add_range调用,进入之后首先查看参数和局部变量:
1 (gdb) s
2 add_range (low=1, high=100) at test1.c:6
3 6 for(i = low; i <= high; i++){
4 (gdb) bt
5 #0 add_range (low=1, high=100) at test1.c:6
6 #1 0x000000000040051c in main () at test1.c:15
7 (gdb) i locals
8 i = 11
9 sum = 55

到这里,看出了问题:由于局部变量i和sum没有初始化,所以具有不确定的值,又由于连次调用是连续的,i和sum正好取类上次调用时的值。i的初始值不是0不要紧,因为在for循环开始重新赋值了,但如果sum的处置不是0,累加得到的结果就错了。
问题找到了,可以退出gdb修改源代码了。然而我们不想浪费一次调试机会,可以在gdb中马上把sum的初始值改为0,继续运行,看看改了之后有没有其他的bug:
01 (gdb) set var sum=0
02 (gdb) finish
03 Run till exit from #0 add_range (low=1, high=100) at test1.c:6
04 0x000000000040051c in main () at test1.c:15
05 15 result[1] = add_range(1, 100);
06 Value returned is $3 = 5050
07 (gdb) s
08 16 printf(“result[0] = %d\nresult[1] = %d\n”, result[0], result[1]);
09 (gdb) s
10 result[0] = 55
11 result[1] = 5050
12 17 return 0;

这样结果就对了。
修改变量的值除了用set命令之外也可以使用print命令,因为print命令后跟的是表达式,而我们知道赋值和函数调用都是表达式,所以还可以用print来修改变量的值,或者调用函数:
1 (gdb) print result[2]=88
2 4=883(gdb)pprintf(result[2]=4result[2]=885 5 = 13

我们知道:printf函数的返回值表示实际打印的字符数,所以$5的结果是13。

总结一下本节使用过的gdb命令:
01 list(l):列出源代码,接着上次的位置往下列,每次列10行
02 list 行号:列出产品从第几行开始的源代码
03 list 函数名:列出某个函数的源代码
04 start:开始执行程序,停在main函数第一行语句前面等待命令
05 next(n):执行下一列语句
06 step(s):执行下一行语句,如果有函数调用则进入到函数中
07 breaktrace(或bt):查看各级函数调用及参数
08 frame(f) 帧编号:选择栈帧
09 info(i) locals:查看当前栈帧局部变量的值
10 finish:执行到当前函数返回,然后挺下来等待命令
11 print(p):打印表达式的值,通过表达式可以修改变量的值或者调用函数
12 set var:修改变量的值
13 quit:退出gdb

<2>断点
程序编辑如下:
01 # include

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值