偵錯程式:gdb
1.gnu計畫的工具;核心除錯kgdb
2.程式的錯誤分類:編譯時錯誤:語法錯誤;執行時錯誤:記憶體錯誤,邏輯錯誤
3.gdb的功能:執行程式;設定斷點;檢視變數的值;
4.gdb的用法:hello.c gcc -g hello.c -o hello gdb hello(可執行檔案)
gdb自帶命令:run //執行程式; list //檢視原始碼; break //設定斷點
gdb圖形化:gdb 檔名 --tui
gdb圖形化使用的命令:
–tui:
layout asm //顯示彙編
layout src //顯示原始碼
layout split //分開顯示
run //執行程式
list //檢視原始碼
finish
continue//結束當前斷點,接著往下執行,直到遇到下乙個斷點;
break+行號 //設定斷點
break+函式名//在函式呼叫處停下來
break+行號 if 條件//
info break //檢視斷點資訊
delete +斷點編號 //刪除斷點
enable +斷點編號
disable+斷點編號 //關掉斷點
單步執行:
step :可以進入子函式
next :不可以進入子函式
工程管理器:make
1.工程管理器:編譯很多個檔案(型別不同,存放在不同目錄,資源檔案使用)組成的軟體**結構
單個.c的編譯–gcc hello.c -o hello
假設有10000個.c(分別儲存在100個不同目錄)——
利用make可以實現自動編譯:①根據makefile檔案內容進行(手動建立 touch makefile)
②根據原始檔的時間戳來判斷檔案是否需要編譯
make-makefile的關係:make讀取makefile裡面的內容進行編譯
2.如何編譯makefile 檔案?
makefile是指令碼檔案(批處理)
makefile語法:目標,依賴,命令
目標:依賴
按下tab鍵 輸入命令
執行命令,依賴這個檔案,最終生成目標
makefile執行順序:自上向下,當你的目標依賴的檔案又是有乙個目標時,會先跳轉到該目標去執行相關命令。
make+目標名:從該目標開始自上而下執行;
偽目標:執行命令,不生成對應的檔案;
定義偽目標: .phony:clean install(目標名)
3.使用偽目標的好處:
執行make命令,只能使用一次,倘若再次執行會出現提示,即目標檔案和可執行檔案都已存在,不能執行第二次。解決辦法:可以修改原始檔,或者刪除 rm -f 目標檔案和可執行檔案;此時偽目標就可以解決這些麻煩;
舉個例子,編寫makeflie時:
.phony:clean //定義clean偽目標
clean:
rm -f hello.o hello // 實現的命令,刪除檔案
資料夾下不會生成clean檔案,make clean 就可以解決多次執行make命令的問題;
4.makefile裡的命令:
echo:相當於在終端上輸出字串
make -f 檔案 :指定檔案,生成makefile檔案
每條命令前面加@:去掉命令回顯;
$ @:代表此目標下,目標體的依賴;
obj:定義變數,例如: obj=hello.o
hello:$(obj) #取變數的值
@gcc $(obj) -o hello
5.makefile的編寫小型計算器,實現加減乘除:
obj=main.o add.o sub.o mul.o div.o
cal: $(obj)
gcc $(obj) -o $@
main.o:main.c
gcc -c main.c
add.o:add.c
gcc -c add.c
sub.o:sub.c
gcc -c sub.c
mul.o:mul.c
gcc -c mul.c
div.o:div.c
gcc -c div.c
6.為什麼將.c檔案先編譯生成.o檔案,再由.o檔案生成可執行檔案?
前提:原始檔到可執行檔案需要經歷,預處理,編譯,彙編,鏈結4個過程;
假設每個過程需要1s,
gcc hello.c -o hello //需要經歷4s
在makefile裡編寫:
cal:main.c add.c sub.c div.c mul.c
gcc *.c -o cal
執行這個命令需要經歷20s;
假設修改了add.c檔案,在這種情況下,執行一次make都需要經歷20s;
但是如果先生成.o檔案。這種情況下,第一次執行需要20s;但第二次編譯只需:4+4s=8s;
(其中4s是add.c重新執行預處理到鏈結的時間,而4s是這4個檔案只要執行鏈結的時間);
所以:先生成.o檔案可以很好地優化程式,減少時間
7.功能目錄管理軟體**:
makefile的分類:
1.總控makefile:進入各個功能目錄執行make,並將所有.o檔案鏈結成可執行檔案;
2.功能目錄makefile:將功能目錄下的原始檔編譯生成目標檔案.o
3.scripts目錄標頭檔案makefile:定義變數,供其他makefile使用
閱讀makefile的順序:先是scripts目錄標頭檔案makefile,然後是總控makefile,最後是功能目錄makefile;
嵌入式c第四次作業
一,結構體的引數傳遞 首先結構體做函式引數有三種傳遞方式 一是傳遞結構體變數,這是值傳遞,二是傳遞結構體指標,這是位址傳遞,三是傳遞結構體成員,當然這也分為值傳遞和位址傳遞。以傳引用呼叫方式傳遞結構比用傳值方式傳遞結構效率高。以傳值方式傳遞結構需要對整個結構做乙份拷貝。下面看乙個列子,student...
嵌入式C學習第四次任務
include include using namespace std struct student void outcome student s 引用傳遞不會進行記憶體重新分配,因此和指標傳參類似,效率很高 void outcome student s 引用傳參 void outcome stud...
第四次總結
學習上 上星期末進行了小組考核,由於網路程式設計那一章節沒用心看用心進,導致考核的時候關於網路程式設計的題都不會做。關於程式設計題的第二題我只做出來一點,在對list集合新增資料的時候實參寫錯了,導致資料新增不進去,然後下面的都寫不了。考試結束後,用了一段時間把第二題寫完了,附加題也是考後才做對。然...