假如現在我們有如下代碼需要編譯運行和調試。文件名爲:test.c
#include <stdio.h>
int main()
{
int day, month, year, sum, leap;
printf("input year month day:\n");
scanf("%d%d%d",&year,&month,&day);
switch(month)
{
case 1: sum = 0; break;
case 2: sum = 31; break;
case 3: sum = 59; break;
case 4: sum = 90; break;
//case 5: sum += 90; break;
//case 6: sum += 90; break;
//case 7: sum += 90; break;
//case 8: sum += 90; break;
}
sum += day;
if(year%400==0 || (year%4==0 && year%100!=0))
{
leap = 1;
}
else{
leap = 0;
}
if(leap == 1 && month>2)
{
sum++;
}
printf("it is the &dth day!\n",sum);
return 0;
}
1、GCC編譯器介紹
在使用GCC編譯器時,需要給出一些列的調用參數,其基本的調用格式如下:
gcc [options] [filenames]
其中options就是GCC所需的參數,filenames便是要編譯的文件名
options 的常用的參數有:
-C :只編譯,不鏈接生成可執行文件。輸入.c等源代碼文件,輸出.o爲後綴的目標文件。通常用於編譯不包含主程序的子程序文件。
-o output_filename:確定輸出文件的名稱爲output_filename,並且這個名稱不能與源文件同名。默認情況下爲:a.out
-g : 產生符號調試工具所必須的符號信息。若想對源代碼進行調試,就需要加入該選項
-O:對程序進行優化編譯、鏈接。
-O2:比-O更好的優化編譯、鏈接,但整個編譯和鏈接過程會比較慢。
其中比較常用的編譯代碼的命令:(-Wall能夠使得GCC產生儘可能多的警告信息)
gcc -Wall test.c -o test
運行代碼的命令爲:(test是上面生成的目標文件test)
./test
2、GDB調試工具介紹
1) 在使用GDB編譯程序時必須要讓GDB可以獲得程序的信息,故而需要在編譯時加入參數-g,編譯命令如下:
gcc -g -o可執行文件名 源文件名
如:gcc -g -o test test.c
2) 在生成帶有調試信息的可執行文件後,可使用如下命令加載可執行程序到GDB調試工具中
gdb 可執行文件
如:gdb test
當然也可以先輸入gdb命令,然後在輸入命令:
file 可執行文件名
如:file test
3) 在進入調試工具GDB後,可以使用break命令設置斷點,如:
break line5 //運行到第五行停止
break function1 //運行到函數function1後停止
break line/function if xx //符合if條件時,運行到指定位置
4) 在程序運行到第一個斷點停止後,可以對接下來的代碼進行單步跟蹤,使用命令:
step
當然也可以使用continue命令繼續運行程序,使得程序運行至下一個斷點或運行完成。
5) 在逐步追蹤的過程中,可以使用如下命令查看變量值:
print 變量名/表達式
print $ //表示輸出當前序號的前一個序號的值
print $$ //表示輸出當前序號向前第二個序號
假如當前序號爲3,則print $ 表示輸出序號爲2中的數據,print $$ 輸出序號爲1中的數據。
print還可用戶給變量賦值和打印連續的空間
print var = 5 //給變量var賦值爲5
print 開始表達式@連續空間大小 //如printarr[2]@5
6) display用戶顯示錶達式的值。與print不同的是程序每步運行都會顯示錶達式的值。
若想使display暫時不能顯示可以使用命令:
disable display
恢復display命令爲:
enable display
直接刪除display命令爲:
delete display [顯示數據的序號]
當設置的程序斷點不再需要暫停運行時,可以使用delete和clear命令清除斷點,二者的區別在於:
delete 斷點編號
clear 斷點所在行號
顯示代碼使用命令list:
list[+] :顯示當前行後面的代碼
list-:顯示當前行前面的代碼
list n: 顯示程序第n行周圍的代碼
list function: 顯示函數名爲function的功能函數代碼
list first, last: 顯示第first行代碼到last行代碼
list , last:顯示從當前行到last行之間的代碼
list filename:n :顯示文件filename的第n行代碼
list filename:function:顯示文件名爲filename中的函數名爲function的函數代碼
set listsize count :設置list顯示的行數爲count
show listsize: 查看當前源代碼的顯示行數
參考文獻:
明日科技,linux C 從入門到精通, 清華大學出版社, 2012.12