歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux綜合 >> Linux資訊 >> 更多Linux

Linux 上的 C/C++ 編譯器和調試器

運行 gcc/egcs     gcc/egcs 的主要選項     gdb     gdb 的常用命令     gdb 使用范例     其他程序/庫工具 (ar, objdump, nm, size, strings, strip, ...)     1.8.1 運行 gcc/egcs  Linux 中最重要的軟件開發工具是 GCC。GCC 是 GNU 的 C 和 C++ 編譯器。實際上,GCC 能夠編譯三種語言:C、C++ 和 Object C(C 語言的一種面向對象擴展)。利用 gcc 命令可同時編譯並連接 C 和 C++ 源程序。     #DEMO#: hello.c     如果你有兩個或少數幾個 C 源文件,也可以方便地利用 GCC 編譯、連接並生成可執行文件。例如,假設你有  兩個源文件 main.c 和 factorial.c 兩個源文件,現在要編譯生成一個計算階乘的程序。  清單 factorial.c  -----------------------  #include   #include     int factorial (int n)  {   if (n <= 1)   return 1;     else   return factorial (n - 1) * n;  }  -----------------------    -----------------------  清單 main.c  -----------------------  #include   #include     int factorial (int n);    int main (int argc, char **argv)  {   int n;     if (argc < 2) {   printf ("Usage: %s n\n", argv [0]);   return -1;   }   else {   n = atoi (argv[1]);   printf ("Factorial of %d is %d.\n", n, factorial (n));   }     return 0;  }  -----------------------  利用如下的命令可編譯生成可執行文件,並執行程序:  $ gcc -o factorial main.c factorial.c  $ ./factorial 5  Factorial of 5 is 120.    GCC 可同時用來編譯 C 程序和 C++ 程序。一般來說,C 編譯器通過源文件的後綴名來判斷是 C 程序還是 C+  + 程序。在 Linux 中,C 源文件的後綴名為 .c,而 C++ 源文件的後綴名為 .C 或 .cpp。  但是,gcc 命令只能編譯 C++ 源文件,而不能自動和 C++ 程序使用的庫連接。因此,通常使用 g++ 命令來完  完成 C++ 程序的編譯和連接,該程序會自動調用 gcc 實現編譯。  假設我們有一個如下的 C++ 源文件(hello.C):    #include     void main (void)  {   cout << "Hello, world!" << endl;  }    則可以如下調用 g++ 命令編譯、連接並生成可執行文件:    $ g++ -o hello hello.C  $ ./hello  Hello, world!      1.8.2 gcc/egcs 的主要選項   表 1-3 gcc 命令的常用選項  選項 解釋  -ansi 只支持 ANSI 標准的 C 語法。這一選項將禁止 GNU C 的某些特色,   例如 asm 或 typeof 關鍵詞。  -c 只編譯並生成目標文件。  -DMACRO 以字符串“1”定義 MACRO 宏。  -DMACRO=DEFN 以字符串“DEFN”定義 MACRO 宏。  -E 只運行 C 預編譯器。  -g 生成調試信息。GNU 調試器可利用該信息。  -IDirectorY 指定額外的頭文件搜索路徑DIRECTORY。  -LDIRECTORY 指定額外的函數庫搜索路徑DIRECTORY。  -lLIBRARY 連接時搜索指定的函數庫LIBRARY。  -m486 針對 486 進行代碼優化。  -o FILE 生成指定的輸出文件。用在生成可執行文件時。  -O0 不進行優化處理。  -O 或 -O1 優化生成代碼。  -O2 進一步優化。  -O3 比 -O2 更進一步優化,包括 inline 函數。  -shared 生成共享目標文件。通常用在建立共享庫時。  -static 禁止使用共享連接。  -UMACRO 取消對 MACRO 宏的定義。  -w 不生成任何警告信息。  -Wall 生成所有警告信息。      1.8.3 gdb  GNU 的調試器稱為 gdb,該程序是一個交互式工具,工作在字符模式。在 X Window 系統中,有一個 gdb 的  前端圖形工具,稱為 xxgdb。gdb 是功能強大的調試程序,可完成如下的調試任務:  * 設置斷點;  * 監視程序變量的值;  * 程序的單步執行;  * 修改變量的值。  在可以使用 gdb 調試程序之前,必須使用 -g 選項編譯源文件。可在 makefile 中如下定義 CFLAGS 變量:  CFLAGS = -g  運行 gdb 調試程序時通常使用如下的命令:  gdb progname    在 gdb 提示符處鍵入help,將列出命令的分類,主要的分類有:  * aliases:命令別名  * breakpoints:斷點定義;  * data:數據查看;  * files:指定並查看文件;  * internals:維護命令;  * running:程序執行;  * stack:調用棧查看;  * statu:狀態查看;  * tracepoints:跟蹤程序執行。  鍵入 help 後跟命令的分類名,可獲得該類命令的詳細清單。      #DENO#    1.8.4 gdb 的常用命令   表 1-4 常用的 gdb 命令  命令 解釋  break NUM 在指定的行上設置斷點。  BT 顯示所有的調用棧幀。該命令可用來顯示函數的調用順序。  clear 刪除設置在特定源文件、特定行上的斷點。其用法為:clear FILENAME:NUM。  continue 繼續執行正在調試的程序。該命令用在程序由於處理信號或斷點而   導致停止運行時。  display EXPR 每次程序停止後顯示表達式的值。表達式由程序定義的變量組成。  file FILE 裝載指定的可執行文件進行調試。  help NAME 顯示指定命令的幫助信息。  info break 顯示當前斷點清單,包括到達斷點處的次數等。  info files 顯示被調試文件的詳細信息。  info func 顯示所有的函數名稱。  info local 顯示當函數中的局部變量信息。  info prog 顯示被調試程序的執行狀態。  info var 顯示所有的全局和靜態變量名稱。  kill 終止正被調試的程序。  list 顯示源代碼段。  make 在不退出 gdb 的情況下運行 make 工具。  next 在不單步執行進入其他函數的情況下,向前執行一行源代碼。  print EXPR 顯示表達式 EXPR 的值。      1.8.5 gdb 使用范例  -----------------  清單 一個有錯誤的 C 源程序 bugging.c  -----------------  #include   #include     static char buff [256];  static char* string;  int main ()  {     printf ("Please input a string: ");   gets (string);     printf ("\nYour string is: %s\n", string);  }  -----------------  上面這個程序非常簡單,其目的是接受用戶的輸入,然後將用戶的輸入打印出來。該程序使用了一個未經過初  始化的字符串地址 string,因此,編譯並運行之後,將出現 Segment Fault 錯誤:  $ gcc -o test -g test.c  $ ./test  Please input a string: asfd  Segmentation fault (core dumped)  為了查找該程序中出現的問題,我們利用 gdb,並按如下的步驟進行:  1.運行 gdb bugging 命令,裝入 bugging 可執行文件;  2.執行裝入的 bugging 命令;  3.使用 where 命令查看程序出錯的地方;  4.利用 list 命令查看調用 gets 函數附近的代碼;  5.唯一能夠導致 gets 函數出錯的因素就是變量 string。用 print 命令查看 string 的值;  6.在 gdb 中,我們可以直接修改變量的值,只要將 string 取一個合法的指針值就可以了,為此,我們在第  11 行處設置斷點;  7.程序重新運行到第 11 行處停止,這時,我們可以用 set variable 命令修改 string 的取值;  8.然後繼續運行,將看到正確的程序運行結果。      #DEMO#    1.8.6 其他程序/庫工具  strip:  nm:  size:  string:




 



Copyright © Linux教程網 All Rights Reserved