C/C++ 开发示例

Docklet提供了GCC 5+ 和 GDB,用于帮助开发 C 程序。

C

文件 sum.c 如下:

#include <stdio.h>
#define TOP 50

int main()
{
    int i = 0 , sum = 0 ;
    while ( i <= TOP ) {
        sum += i ;
        i++ ;
    }
    printf(" Sum of 1 to %d is %d\n", TOP, sum ) ;
    return 0 ;
}

进入WEB Terminal,编译并运行

$ gcc -g sum.c -o sum
$ ./sum
 Sum of 1 to 50 is 1275

C++

下面显示了一个有错的C++程序main.cpp,原文来源于这里

#include<iostream>

using namespace std;

long factorial(int n);

int main()
{
    int n(0);
    cin>>n;
    long val=factorial(n);
    cout<<val;
    cin.get();
    return 0;
}

long factorial(int n)
{
    long result(1);
    while(n--)
    {
        result*=n;
    }
    return result;
}

进入 WEB Terminal,编译并运行,输入 5 ,结果 0

$ g++ -g main.cpp -o main
$ ./main
5
0

用gdb进行调试

$ gdb ./main
1.      $ g++ main.cpp -g -Wall -o main
2.      $ gdb main
3.      GNU gdb (Ubuntu 7.10.1-0ubuntu1) 7.10.1
4.      Copyright (C) 2015 Free Software Foundation, Inc.
5.      This GDB was configured as "i686-redhat-linux-gnu".
6.      For bug reporting instructions, please see:
7.      <http://www.gnu.org/software/gdb/bugs/>...
8.      Reading symbols from /root/main...done.
9.      (gdb) break 11
10.     Breakpoint 1 at 0x80485f9: file main.cpp, line 11.
11.     (gdb) run
12.     Starting program: /root/main
13.     3
14.     
15.     Breakpoint 1, main () at main.cpp:11
16.     11        long val=factorial(n);
17.     (gdb) step
18.     factorial (n=3) at main.cpp:19
19.     19        long result(1);
20.     (gdb) list
21.     14        return 0;
22.     15      }
23.     16
24.     17      long factorial(int n)
25.     18      {
26.     19        long result(1);
27.     20        while(n--)
28.     21        {
29.     22          result*=n;
30.     23        }
31.     (gdb) watch n
32.     Hardware watchpoint 2: n
33.     (gdb) watch result
34.     Hardware watchpoint 3: result
35.     (gdb) continue
36.     Continuing.
37.     Hardware watchpoint 3: result
38.     
39.     Old value = 0
40.     New value = 1

result 变量初始化为1。

41.     factorial (n=3) at main.cpp:20
42.     20        while(n--)
43.     (gdb)

注意刚才没有输入任何命令,只是输入回车,它会重复执行上一条命令。

44.     Continuing.
45.     Hardware watchpoint 2: n
46.     
47.     Old value = 3
48.     New value = 2

注意 n 从 3 变成了 2.

49.     0x08048654 in factorial (n=2) at main.cpp:20
50.     20        while(n--)
51.     (gdb)
52.     Continuing.
53.     Hardware watchpoint 3: result
54.     
55.     Old value = 1
56.     New value = 2

此时 result变成了 2。我们已经发现了一个bug: result最终的值应为 3*2*1, 但这里只是从 2 开始计算,问题出在 while (n--)上。

将代码修改为如下

while(n>0) //doesn't let n reach 0
{
  result*=n;
  n--;        //decrements only after the evaluation
}

测试运行通过。

原文 给出了更详细的调试过程。

GDB的官方手册请参考 GDB手册

results matching ""

    No results matching ""