標籤:style http 使用 檔案 io art
程式的調試(先得安裝gdb工具,以root身份執行命令:sudo apt-get install gdb)
程式的調試是一個很重要的環節,windows IDE下那些強大的調試功能,Linux以什麼來對比呢,當然,在我看來,無所不能的linux一樣可以勝任調試工作,有過之而無不及,那就是安裝開發工具後,另一個整合於linux中的工具,gdb。
它是一款由GNU組織開發並發布的UNIX/Linux下的程式調試工具,雖然它沒有圖形化的友好介面,但是它功能異常強大,足以和其他一些商業化的IDE環境相媲美。
這時要說的是,調試的對像是可執行檔,而不是以".c"結尾的原始碼檔案,也就是說,源碼檔案,需要經過gcc編譯之後產生哥執行檔案才能用gdb調試。
下面就來介紹它的使用,像上面一樣,我們參照一個來源程式:
[[email protected] 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參數,用於在編譯檔案中加入一些調試資訊。
[[email protected] programs]$ gcc -g smallest.c -o smallest
[[email protected] programs]$ ls
hello_world hello_world.c smallest smallest.c
從上面我們可以看出,有一個smallest產生出來,如果你想驗證加上參數g後的變化,那麼你可以不加g編譯一次,然後比較其大小,你會發現,加上g後,產生的編譯檔案體積也會增加,所以在我們做軟體開發時,加入調試資訊應該在初期設計時,後期時,就應用去掉這些調試資訊,當然如果想保留軟體自身的調試功能,就要保留了。
言歸正傳。
使用gdb命令運行編譯檔案時,就可以看到如下資訊,像其他的工具一樣帶有一些解說文字,包含一些著作權、版本及其他說明,最後的(gdb)就是其環境提示符,類似於shell提示符,用於提醒使用者,在此後面輸入命令。
[[email protected] 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, 如下樣本
[[email protected] 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) 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
7 printf("Please Input the first Number:\n");
8 scanf("%d",&num1);
9 printf("Please Input the second Number:\n");
10 scanf("%d",&num2);
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 {
(gdb)
大家可以看到它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.
(gdb)
然後我們再看下一個命令
-----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
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 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:
14
Breakpoint 2, min (a=12, b=14) at smallest.c:17
17 if(a<b)
(gdb)
可以看到,停在了我們行鐩設定的斷點min函數處。
下面我們來分步執行函數,
-----step,逐步執行
樣本是接著上面的例子繼續執行的
Breakpoint 2, min (a=12, b=14) at smallest.c:17
17 if(a<b)
(gdb) step
18 return a;
(gdb) step
21 }
(gdb) step
Breakpoint 1, main () at smallest.c:12
12 printf("The minimal one is %d\n", min_num);
(gdb) step
The minimal one is 12
13 }
(gdb)
可以看到,執行step時,是按照順序一步一步執行的,並且在min函數的斷點處進入了函數體執行,直至結束,當然我們也可以換成next來執行,只不過next不進入函數體內部,把函數當成一個執行步驟來執行。
以上就是幾個常用的gdb內部命令了,有一個地方需要提一下的是,當我們在執行到斷點時,為了方便測試,我們可以在這個地方為已定義的變數賦值,只需在gdb提示符下輸入: set 變數名=值
然後打入continue繼續執行就可以了。
這篇文章介紹了linux下編輯,編譯和偵錯工具的基本方法,使用的是vim/vi、gcc以及gdb的組合來進行c程式設計,其中有更多的玄妙之處,期待著大家在使用的時候去發現,本文僅是介紹一下概況,供參考。
OK,關於linux C語言開發的開始部分,就到這裡了!