天天看點

linux C(hello world)程式調試

程式的調試(先得安裝gdb工具,以root身份執行指令:sudo apt-get install gdb)

程式的調試是一個很重要的環節,windows IDE下那些強大的調試功能,Linux以什麼來對比呢,當然,在我看來,無所不能的linux一樣可以勝任調試工作,有過之而無不及,那就是安裝開發工具後,另一個內建于linux中的工具,gdb。

它是一款由GNU組織開發并釋出的UNIX/Linux下的程式調試工具,雖然它沒有圖形化的友好界面,但是它功能異常強大,足以和其他一些商業化的IDE環境相媲美。

這時要說的是,調試的對像是可執行檔案,而不是以".c"結尾的源代碼檔案,也就是說,源碼檔案,需要經過gcc編譯之後生成哥執行檔案才能用gdb調試。

下面就來介紹它的使用,像上面一樣,我們參照一個源程式:

[bruce@server1 programs]$ vim smallest.c

//find the minimal between 2 INT Number

#include <stdio.h>

int min(int x, int y);

int main()

{

        int num1,num2,min_num;

        printf("Please Input the first Number:\n");

        scanf("%d",&num1);

        printf("Please Input the second Number:\n");

        scanf("%d",&num2);

        min_num=min(num1,num2);

        printf("The minimal one is %d\n", min_num);

}

int min(int a, int b)

        if(a<b)

        return a;

        else

        return b;

~    

程式已經寫在了上面,下面我們就來看一下如何産生帶有調試資訊的編譯檔案,這裡我們要使用gcc的-g參數,用于在編譯檔案中加入一些調試資訊。

[bruce@server1 programs]$ gcc -g smallest.c -o smallest

[bruce@server1 programs]$ ls

hello_world  hello_world.c  smallest  smallest.c

上面我們可以看出,有一個smallest産生出來,如果你想驗證加上參數g後的變化,那麼你可以不加g編譯一次,然後比較其大小,你會發現,加上g後,

産生的編譯檔案體積也會增加,是以在我們做軟體開發時,加入調試資訊應該在初期設計時,後期時,就應用去掉這些調試資訊,當然如果想保留軟體自身的調試功

能,就要保留了。

言歸正傳。

使用gdb指令運作編譯檔案時,就可以看到如下資訊,像其他的工具一樣帶有一些說明文字,包含一些版權、版本及其他說明,最後的(gdb)就是其環境提示符,類似于shell提示符,用于提醒使用者,在此後面輸入指令。

[bruce@server1 programs]$ gdb smallest

GNU gdb Fedora (6.8-27.el5)

Copyright (C) 2008 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 "i386-redhat-linux-gnu"...

(gdb)

下面來說一些常用的gdb調試指令

list 或是l   用于列出源程式

            每打入一次list或是l将顯示10行源代碼,或是指定列出的行号來檢視源程式 “list 行号”

            使用此參數時,要確定源程式沒有被移除或移動位置,否則無法檢視。

break/b     設定斷點,可指定斷點行号,或是函數名等。

info break  顯示斷點資訊

run         運作程式

print       檢視程式運作時對應表達式的和變量的值

next        單步運作程式,但不進入函數調用

step        單步運作程式,且進行函數調用

continue    繼續執行函數,直至函數結束或是下一個斷點

下面以smallest.c程式來挨個講解gdb這幾個常用指令的用法

----- list/l, 如下示例

(gdb) l

1       //find the minimal between 2 INT Number

2       #include <stdio.h>

3       int min(int x, int y);

4       int main()

5       {

6               int num1,num2,min_num;

7               printf("Please Input the first Number:\n");

8               scanf("%d",&num1);

9               printf("Please Input the second Number:\n");

10              scanf("%d",&num2);

(gdb) list 12

11              min_num=min(num1,num2);

12              printf("The minimal one is %d\n", min_num);

13      }

14

15      int min(int a, int b)

16      {

大家可以看到它list/l的功能了吧,非常的簡單,适合于手工檢查程式文法錯誤,多個逗号,少個分号的情況,也就可以從這看得到了,當然這種錯誤,gcc也會告訴你的。

-----break/b,設定數點,如下:

(gdb) b 12

Breakpoint 1 at 0x8048448: file smallest.c, line 12.

(gdb) break min

Breakpoint 2 at 0x804846a: file smallest.c, line 17.

然後我們再看下一個指令

-----info break/b  顯示斷點資訊

(gdb) info break

Num     Type           Disp Enb Address    What

1       breakpoint     keep y   0x08048448 in main at smallest.c:12

2       breakpoint     keep y   0x0804846a in min at smallest.c:17

(gdb) info b

我們從上面顯示可以看出,info break列印出了,我們先前設定好的兩個斷點,一個是在main函數的第12行,另外一個是在min函數。

下面就可以來運作程式了

-----run/r, 運作程式。

可以打入一個r,也可以輸全run來運作程式:

(gdb) r

Starting program: /home/bruce/programs/smallest

Please Input the first Number:

12

Please Input the second Number:

Breakpoint 2, min (a=12, b=14) at smallest.c:17

17              if(a<b)

可以看到,停在了我們行鐩設定的斷點min函數處。

下面我們來分步執行函數,

-----step,單步執行

示例是接着上面的例子繼續執行的

(gdb) step

18              return a;

21      }

Breakpoint 1, main () at smallest.c:12

The minimal one is 12

可以看到,執行step時,是按照順序一步一步執行的,并且在min函數的斷點處進入了函數體執行,直至結束,當然我們也可以換成next來執行,隻不過next不進入函數體内部,把函數當成一個執行步驟來執行。

以上就是幾個常用的gdb内部指令了,有一個地方需要提一下的是,當我們在執行到斷點時,為了友善測試,我們可以在這個地方為已定義的變量指派,隻需在gdb提示符下輸入: set 變量名=值

然後打入continue繼續執行就可以了。

這篇文章介紹了linux下編輯,編譯和調試程式的基本方法,使用的是vim/vi、gcc以及gdb的組合來進行c程式設計,其中有更多的玄妙之處,期待着大家在使用的時候去發現,本文僅是介紹一下概況,供參考。

OK,關于linux  C語言開發的開始部分,就到這裡了!