gcc編譯器和gdb偵錯程式

2021-09-26 08:29:20 字數 2886 閱讀 6613

將高階語言(c語言)程式編譯成為機器可識別的指令**

編譯過程:

預處理:去掉注釋,展開所有**

編譯:語義、語法糾錯,將**解釋成為彙編**

彙編:將彙編**解釋成為機器指令**

連線:鏈結**庫以及所有的目標檔案,生成可執行程式

庫檔案:大佬實現一些常用的功能介面,為了防止每次編譯耗費大量時間,因此將這些介面**進行編譯彙編,並且將彙編完成的**儲存到乙個檔案中,這個檔案就叫做庫檔案。

這時候如果想用庫函式,就需要包含標頭檔案中,因為標頭檔案中宣告這個函式的存在,這時候編譯器在標頭檔案中檢測到這個宣告,就知道有這個函式的實現,就不會報錯。

最終連線生成可執行程式的時候,因為要具體實現讓cpu處理指令,因此就必須將這些介面的具體實現拿過來。

優點:占用資源少,在記憶體中大量程式可以共享使用(共享庫)

缺點:執行時需要依賴庫的存在(執行時庫)

#include #include #include void func()

int main(int argc,char *ar**)

//執行程式時,執行程式名稱後以空格間隔起來的資料,就是程式的執行引數;

{ int i;

printf("--------\n");

for(i=0;i除錯乙個程式的前提:生成debug版本程式,向程式中新增除錯符號資訊

linux下gcc預設生成的程式是release版本程式

需要加上-g選項,生成debug版本程式

gcc -g main.c -o main

gdb引導程式

gdb ./main

gdb -> file ./main

獲取執行引數,並執行程式

r -a -l -s -t

最常見的除錯操作有哪些?

斷點

b(break):打斷點

b file:linne:指定行打斷點

b function_name :給函式打斷點

i(info):檢視除錯資訊

i b :檢視斷點資訊

d(delete) :刪除斷點

d b_id(斷點編號)

單步除錯

start:開始逐步除錯

l(liat):檢視除錯行附近的**

l file:line 檢視指定行**

until file:line

watch 變數監控

watch var name

c(continue) 繼續開始執行

列印變數內容

p(print) 列印變數內容

p var_name

檢視呼叫棧資訊

bt 快速定位程式崩潰位置

make/makefile:專案自動化構建工具

makefile: 普通的文字檔案,記錄了專案的構建流程

make: 乙個解釋程式,到當前執行make命令的目錄下尋找makefile檔案,並且對makefile中記錄的專案構建規則進行解釋執行。

makefile編寫規則

目標物件:依賴物件

main:main.c child.c

[tab]命令操作

gcc main.c child.c -o main

make執行規則

1.解釋執行時,在makefile中尋找目標物件(只尋找第乙個目標物件),找到目標物件後,執行命令操作

如果有目標物件,判讀目標物件是否存在

如果目標物件不存在:執行命令操作生成目標物件

如果目標物件已經存在:判斷是否有依賴物件

沒有依賴物件:直接報錯(目標最新),不需要重新生成

如果有依賴物件:判斷依賴物件是否存在?

依賴物件存在:通過目標物件和依賴物件的最後一次修改時間判斷的是否需要重新執行操作命令,生成目標物件

依賴物件不存在:make繼續在makefile中尋找依賴物件的生成規則,生成依賴物件,進而在生成目標物件

預定義變數:

$@: 目標物件

$^: 所有依賴物件

$<: 依賴物件中的第乙個

偽物件:目標對像每次都要重新執行(不管是否存在,是否更新)

宣告偽物件 .phony……

git:專案版本控制工具……

…………

進度條程式

\r 和\n

printf(hello)—不帶有\n時,資料先被寫入到緩衝區中,等到緩衝區滿了/重新整理緩衝區,才會被寫入檔案

\n在操作的檔案為終端顯示檔案,不僅具備換行作用,還具有重新整理緩衝區的作用(僅僅針對終端顯示檔案)

GCC編譯器和GDB偵錯程式

gcc gnu compiler collection 是目前linux下最常用的c語言編譯器,它是gnu專案中符合ansi c標準的編譯系統,可以在多種硬體平台上編譯出可執行程式的超級編譯器,執行效率與一般的編譯器相比平均效率要高20 30 在終端中輸入下列命令 gcc options filen...

GCC編譯器和GDB偵錯程式常用選項

gcc hello.c o hello 將hello.c編譯成hello可執行檔案 gcc e hello.c o hello.i 將hello.c 轉換成預處理後的檔案hello.i gcc s hello.c o hello.s 將hello.c 轉換成彙編檔案 hello.s gcc c he...

GCC編譯器和GDB偵錯程式常用選項

gcc hello.c o hello 將hello.c編譯成hello可執行檔案 gcc e hello.c o hello.i 將hello.c 轉換成預處理後的檔案hello.i gcc s hello.c o hello.s 將hello.c 轉換成彙編檔案 hello.s gcc c he...