Linux下的gdb调试makefile的编写
1.gdb調試
gdb就是用于調試可執行文件,要想讓程序在調試的時候有提示信息在生成文件時加上-g
(1)啟動gdb:gdb +包含調試信息的應用程序
(2)l(只能查詢包含在可執行程序里邊的.c文件):查看第一個有主函數的文件的前十行帶碼
也可以在l后邊加.c文件再加:加想要參看的函數名或者行數
(3)斷點:b/break +行數:當程序運行到斷點會停下
在斷點也可以設置條件比如:b+行數(有個for循環)+if i==9(不會停在fo循環哪一行只會停在for循環里邊)
(4)info/i+b/brea:查看斷點,可以看到斷點的編號和一些其他的相關信息
(5)調試語法:
run或start:開始運行程序
n:運行一步
c:運行直到遇到斷點
s:當斷點是一個函數輸入s就可以打開函數里邊的內容
ptype +變量:查看變量信息
display+變量名:追蹤變量的值
undisplay+追蹤變量的編號(可以用info display查看:不再追蹤該變量
d+斷點編號(同樣用info查看):刪除斷點
finish:當進入函數體內部時,假設該函數在另一個文件里那么可以用finish跳出
set var+給變量賦值:產看變量等于你設置的值的時候時的狀態
u:退出當前循環
p+變量:產科變量當前的值
quit:退處gdb
2.makefile的編寫:管理程序的源代碼
(1) makefile 的規則:
最終目標:依賴條件
命令:
例如:
main.out:a.c b.c c.c d.c main.c
(必須有tab縮進)gcc a.c b.c c.c d.c main.c -o main.out
以上便是最簡單的makefile
(2)以上makefile有一個較大缺陷,如果有一個.c文件被修改那么重新用makefile時就會重新編譯所有的.c文件那么改進:
系統會先找終極目標所需要的依賴發現沒有便會在下邊的規則中找到對應的依賴然后執行規則中的代碼,等所有依賴找到后執行生成最終目標的代碼,也就可以說所有的規則是為生成最終目標而服務的。
那么為啥會解決剛開始的問題呢:如果a中的.c經過修改后那么.c的最終生成時間就會晚于舊的.o,而舊的.o文件就是由.c文件編譯而來,那么如果.c文件晚于.o文件說明.c文件需要更新,進而不需要更新別的.o文件避免造成不必要的在編譯時間上的浪費
(3)改進后的makefile任由較大缺陷,經過再次改進:
以上解決了很多操作相同的但是只是參數不同帶來的冗余問題
$:代表取值的意思
以下是只能在規則命令中使用的自動變量
$<:代表第一個依賴,當依賴目標是以%定義的那么其代表的是符號模式的一系列文件集
$@:規則中的目標
$^:規則中的所有依賴
一般大寫的是系統維護的一些變量
%.o:%.c:生成最終目標的依賴是a.o等,那么就會與%.o:%.c就會匹配成a.o:a.c然后依次類推
(4)makefile中常用的兩個函數(makefile所有函數都有返回值):
wildcard:獲取到指定目錄下的所有.c文件
patsubst:匹配替換函數(注意匹配是%)
makefile第個規則的目標是最終目標其余其余的規則要么是為終極目標服務的要么與終極目標無關
make指令得到最終的目標上圖就是app
make clean就是執行clean的目標代碼
-:在makefile中執行時只要有錯誤就不會往下邊執行,-的目的就是遇到錯誤直接跳過繼續執行
-f:如果你已經執行過一次clean再執行就會報錯,-f對于上圖來說就是即使刪除過一遍不管有沒有再一次刪除也不會報錯,繼續執行
.PHONY:clean(對于上圖來說):用.PHONY修飾是一個為目標,其實每條規則都會有一個最終目標,對于clean最終目標就是clean但是又不會生成clean文件,這時候如果makefile所在目錄下有clean文件那么由于更新系統即使make clean也不會執行,磁盤下的clean文件永遠是最新的,這時候就可以用偽目標來不進行更新系統直接執行
總結
以上是生活随笔為你收集整理的Linux下的gdb调试makefile的编写的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux下的vim编辑器与gcc编译器
- 下一篇: Linux部分系统IO函数