Pin-Jiun / MIT-6.S081-Operating-System-Engineering

0 stars 0 forks source link

2.0-GDB #3

Open Pin-Jiun opened 2 years ago

Pin-Jiun commented 2 years ago

GNU Debugger (GDB)

GNU軟體系統中的標準偵錯器,支持以下語言


測試檔案testgdb.c

#include<stdio.h>
int main(){
   /* 2D array declaration*/
   int disp[2][3];
   /*Counter variables for the loop*/
   int i, j;
   for(i=0; i<2; i++) {
      for(j=0;j<3;j++) {
         printf("Enter value for disp[%d][%d]:", i, j);
         scanf("%d", &disp[i][j]);
      }
   }
   //Displaying array elements
   printf("Two Dimensional array elements:\n");
   for(i=0; i<2; i++) {
      for(j=0;j<3;j++) {
         printf("%d ", disp[i][j]);
         if(j==2){
            printf("\n");
         }
      }
   }
   return 0;
}

GCC C語言編譯回顧

若要將 C 的原始碼編譯成執行檔,可以執行 gcc 並指定 C 語言的原始碼檔案:

gcc testgdb.c

GCC 預設會執行編譯與連結,直接產生一個可以執行的程式,輸出至 a.out 這個檔案,完成編譯之後,即可執行這個程式:

./a.out

若要指定輸出的執行檔名稱,可以加上 -o 參數,並指定輸出的檔案名稱:

gcc -o exe_Name(執行檔名稱) testgdb.c

若想讓編譯器只進行編譯、不要連結,可加上 -c 參數,這樣就會建立一個 object 檔 .o

gcc -c hello.c

執行這行之後,就會產生一個 hello.o檔案,後續若要進行連結,就可以使用這個object 檔

gcc -o hello hello.o

通常在大型的專案中,都會將編譯與連結兩個動作拆開,以下是一個典型的例子:

# 編譯個別 C 檔案
gcc -c a.c
gcc -c b.c
gcc -c c.c

# 連結
gcc -o myapp a.o b.o c.o

這樣作除了可讓程式碼方便管理之外,也可以加快編譯的速度,假設我們在開發過程中,更改了 b.c 的內容,在重新編譯時就只要編譯 b.c,然後即可進連結,省去重新編譯 a.c 與 c.c 的時間。


GDB除錯

顯示警告訊息 -Wall 加入除錯資訊 -g 一定要記得加-g 方可進行gdb除錯

gcc -Wall -g -o test testgdb.c

開始進行除錯,如要退出gdb模式,輸入quit gdb ./test

成功則會顯示Reading symbols from ./test...


GDB commands


1.設立至少一個breakpoint ex: b main 2.依照需求使用layout src/asm/split 3.執行此程式 run (r) 4.n/step/finish

image

Pin-Jiun commented 1 year ago