1. 程式人生 > >Makefile管理工具與GDB除錯工具學習筆記

Makefile管理工具與GDB除錯工具學習筆記

一、Makefile專案管理工具:

1、用途:

①專案程式碼編譯管理
②節省編譯專案時間
③一次編寫終身受益

2、規則記錄:

(1)、三要素:

目標、依賴、命令,格式如下:

目標:依賴(條件)
    命令
/*注意:命令前有一個Tab鍵。*/

(2)、基本實現:

以加減乘除計算的四個函式為例:

all:add.c sub.c dive.c mul.c main.c 
    gcc add.c sub.c dive.c mul.c main.c -o app

解析:為了達成all目標(目標名自定義,一般以目標生成檔名為目標名),依賴於一系列“.c”檔案。如何達成目標?就是執行命令“gcc add.c sub.c dive.c mul.c main.c -o app”。

(3)、工程編譯中的細化:

app:add.o sub.o dive.o mul.o main.o
    gcc add.o sub.o dive.o mul.o main.o -o app
add.o:add.c
    gcc -c add.c
sub.o:sub.c
    gcc -c sub.c
dive.o:dive.c
    gcc -c dive.c
mul.o:mul.c
    gcc -c mul.c
main.o:main.c
    gcc -c main.c

關係圖如下:
這裡寫圖片描述

Makefile工作步驟:
建立關係樹(樹根節點為徐要生成的目標可執行檔案)->根據關係樹從底到上執行命令->根據依賴檔案的最後更改時間比目標新來確定更新->如果目標不依賴任何檔案,則執行對應命令,以示更新。

clean:
    -rm -f *.o
    -rm -f app

對於上面這個目標指令一般解除安裝Makefile檔案最後,make clean(只執行clean目標的命令,“make + 目標名”只執行目標對應的命令),注意:rm前的“-”表示即使該條命令出錯也會繼續向後執行。

(4)、make clean的問題:

由於clean無依賴關係所以加上:“.PHONY:clean”用來生成一個偽目標,否則如果Makefile檔案所在資料夾中有一個無關的名為clean檔案,make clean就會出錯,事與願違。如下:

.PHONY:clean
clean:
    -rm
-f *.o -rm -f app

(5)、“@”符號:

不顯示命令本身,只顯示結果eg:

test:
    echo "hello"
    @echo "hello" 

make test看一看結果:
不加@符號:
這裡寫圖片描述
加@符號:
這裡寫圖片描述

(6)、更高階的Makefile(#表示註釋):

#$表示索引
#三個重要的變數:"[email protected]"表示目標,"$^"表示所有依賴,"$<"表示依賴中的第一個

obj=add.o sub.o dive.o mul.o main.o
app:$(obj)
    gcc $(obj) -o app

#採用內建語法規則去編譯(有的Makefile下面預設沒有,需要自己寫)
%.o:%.c
    gcc -c $< -o [email protected]

.PHONY:clean
clean:
    -rm -f *.o
    -rm -f app

(7)、藉助Makefile的函式去優化:

#wildcard函式找到當前目錄下的所有.c檔案,賦給變數src
src = $(wildcard *.c)
#patsubst函式將匹配到的所有.c轉換成.o賦給變數obj
obj = $(patsubst %.c,%.o,$(src))
#為目標檔案重新命名
target = app

$(target):$(obj)
    gcc $^ -o [email protected]
%.o:%.c
    gcc -c $< -o [email protected]
.PHONY:clean
clean:
    -rm -f *.o
    -rm -f app

(8)、藉助變數去優化(變數名固定):

#指定標頭檔案位置在./include目錄中
CPPFLAGS= -I ./include
#指定編譯引數
CFLAGS= -g -Wall
#指定連結庫位置path與名字,無連線庫不賦值即可
#LDFLAGS=
LDFLAGS= -L path -lmycalc
#指定編譯器
CC=gcc

#用於Linux嵌入式編譯的編譯器
#CC=arm-linux-gcc

src = $(wildcard *.c)
obj = $(patsubst %.c,%.o,$(src))
target = app

$(target):$(obj)
    $(CC) $^ $(LDFLAGS) -o [email protected]
%.o:%.c
    $(CC) -c $< $(CFLAGS) $(CPPFLAGS) -o [email protected]
.PHONY:clean
clean:
    -rm -f *.o
    -rm -f app

(9)、思考:

根目錄下有一個Makefile,下一級目錄home中有一個Makefile,如何在根目錄下make實現home目錄下的專案編譯?
實現:在根目錄下的Makefile中寫:

#-C引數指定進入的路徑,即在根目錄下執行make時,先讀取根目錄下的Makefile檔案即執行make -C /home/:先進入/home再讀取/home下的Makfile檔案。

all:
    make -C /home/

二、GDB除錯工具:

1、首先編譯的時候必須先加-g(不加-g無法除錯)

eg:gcc -o test1 test.c(×)
gcc -o test2 -g test.c(√)

我們發現加了-g的連結檔案比不加-g的大一些。因為加-g的包含除錯資訊:

這裡寫圖片描述

2、GDB命令:除錯時輸入GDB test2進入GDB

(括號中的字母均是簡寫)
help(h):檢視常用命令類,“help + 類名”檢視該類的具體包含的命令;
quit(q):退出;
run(r):全速執行;
start:啟動程式,單步執行;
list:檢視程式程式碼,一次顯示一段,連續list則按順序一段一段顯示(回車可重複上次命令),“list + 函式名”可檢視指定函式;
next(n):逐過程,執行下一步(回車可重複上次命令),不進入語句呼叫的函式中
step(s):逐語句,執行下一步(回車可重複上次命令),會進入語句呼叫的函式中
print(p):加變數名可以列印變數內容(eg:print i、print &i等);

break(b):設定斷點,"break + 行號"為檔案中某行設定斷點
continue(c):繼續全速執行

info(i):檢視GDB內部區域性變數的值
info breakpoints:檢視設定的斷點資訊
delete(d) breakpoints 編號:刪除指定編號斷點

backtrace(bt):顯示當前的所在位置的函式呼叫關係
frame:切換棧幀(frame + 行號),暫時切換到指定行(eg:當前在100行,要檢視其他函式的區域性變數(假設在第十行):frame 10,在第十行的函式中檢視區域性變數的值,檢視完之後next回到101行,next能回到101行是因為frame(f):是切換棧幀,就是這個意思)

finsh:結束當前函式,返回函式呼叫點
set:設定變數值(eg:set var n=100,set var buf[2]='x',...)
run argv[1] argv[2]...:除錯時命令列傳參

display:設定觀察點(eg:display num)
undisplay:取消觀察點設定(undisplay 觀察點編號)
enable breakpoints:啟用所有斷點
disable breakpoints:禁用所有斷點

x:檢視記憶體(eg:x/20x buf,20個位元組,按十六進位制顯示)
watch:被設定觀察點的變數被修改時,會列印顯示(與display區別)
(info)i watch:顯示觀察點

core:核心(日誌檔案)
ulimit -a:檢視core檔案大小,預設是0
ulimit -c 1024:將core檔案大小調節成指定的1024
gdb ./a.out core:便可檢視程式bug出現時的資訊。

set follow-fork-mode child:跟蹤子程序
set follow-fork-mode parent:跟蹤父程序

相關推薦

Makefile管理工具GDB除錯工具學習筆記

一、Makefile專案管理工具: 1、用途: ①專案程式碼編譯管理 ②節省編譯專案時間 ③一次編寫終身受益 2、規則記錄: (1)、三要素: 目標、依賴、命令,格式如下: 目標:依賴(條件) 命令 /*注意:命令前有一

arm-linux-gdb除錯工具的安裝交叉編譯gdbserver

arm-linux-gdb除錯工具的安裝與交叉編譯gdbserver 分類:嵌入式 開發環境:LPC3250 開發板:安裝linux2.6.39; 交叉編譯工具:arm-none-linux-gnueabi-gcc pc的虛擬機器:Linux version 2.6.32.

深入理解_JVM內存管理JDK監控工具故障處理工具07

最大 jhat hotspot interval 統計信息 傳遞 啟動 令行 相同 1、jps: JVM process Status Tool,顯示系統所有的HotSpot虛擬機進程以及進程的本地虛擬機的唯一ID(LVMID,Local Virtual Mac

【Linux C/C++】 第07講 gdb除錯工具詳解

     當你需要單步跟蹤除錯的時候,就必然會用到gdb工具,不同於VS方便的除錯方式,gdb的除錯並不是那麼的方便直觀。不要降低熱情,熟練以後你會發現Linux下的程式設計方式非常好用。       一、簡介   &

gdb除錯工具使用

gdb命令使用格式如下: gdb [選項] [可執行程式[core檔案|程序ID]] 常用選項: -c core檔案 使用指定core檔案檢查程式 -h 列出命令選項的簡要介紹 -n 忽略~/.gdbinit檔案中指定的執行命令 -q 禁止顯

gdb 除錯工具 --- 使用方法淺析

gdb 除錯工具使用方法淺析 1. 什麼是gdb gdb是GNU debugger的縮寫,是程式設計除錯工具。 2. gdb的功能 啟動程式,可以按照使用者自定義的要求隨心所欲的執行程式。 可讓被除錯的程式在使用者所指定的除錯斷點處停住(斷點可

arm linux下交叉編譯gdb除錯工具

       由於嵌入式系統資源有限性,一般不能直接在目標系統上進行除錯,通常採gdb+gdbserver的方式進行除錯。Gdbserver在目標系統中執行,gdb則在宿主機上執行。要進行GDB除錯,目標系統必須包括gdbserver程式,宿主機也必須安裝gdb程式,一般li

gdb除錯工具常用命令

編譯程式時需要加上-g,之後才能用gdb進行除錯:gcc -g main.c -o main gdb中命令: 回車鍵:重複上一命令 (gdb)help:檢視命令幫助,具體命令查詢在gdb中輸入help + 命令,簡寫h (gdb)run:重新開始執行檔案(run-text:載入文字檔

Mac上安裝GDB除錯工具,並且使用eclipse來進行除錯的環境搭建

Mac上安裝GDB除錯工具,並且使用eclipse來進行除錯的環境搭建 背景 版本 GDB安裝過程 安裝前的準備工作 XCode的安裝 brew的安裝

工具GDB除錯精粹及使用例項

一:列檔案清單  1. List  (gdb) list line1,line2  二:執行程式  要想執行準備除錯的程式,可使用run命令,在它後面可以跟隨發給該程式的任何引數,包括標準輸入和標準輸出說明符(<和>)和外殼萬用字元(*、?、[、])在內。  如果你使用不帶引數的run命令,gdb

gdb除錯工具的使用

1.gdb介紹 GDB是一個強大的命令列除錯工具。大家知道命令列的強大就是在於,其可以形成執行序列,形成指令碼。UNIX的軟體全是命令列的,這給程式開發提代供了極大的便利,命令列軟體的優勢在於,它們可以非常容易的整合在一起,使用幾個簡單的已有工具的命令,就可以

gdb除錯工具使用(1)

今天開始學習在linux下面進行c++程式碼的除錯方法的學習。使用GDB除錯c++程式碼是unix環境c++程式設計的基本技能。對於長期在windows平臺下面從事c++程式設計的程式設計師來說,在linux環境下面進行gdb除錯確實有點難為人,但是gdb本身是一個功能強大

GDB除錯工具入門

0 gdb介紹 偵錯程式GDB允許檢視在執行一個程式時其內部時發生了什麼,或者是程式奔潰(crashed)時它正在做什麼。 gdb通過以下四種事情來捕獲某個行為的異常錯誤(bug): 執行程式,指定可能影響其動作的內容。 讓程式在指定的情況下停止。

GDB 除錯工具入門

GDB是GNU開源組織釋出的一個強大的UNIX下的程式除錯工具,通常在伺服器上開發C/C++時,該工具是必不可少的。下面,將通過例子詳細介紹GDB的使用。 1. 源程式  #include<i

linux gdb 除錯工具

進入 gdb 除錯模式後 help 檢視支援的所有命令 info thread 列出所有的執行緒 thread apply all bt 檢視所有執行緒的呼叫堆疊 thread ID 切換到指定

2018-2019-1 20189206 《文獻管理資訊分析》學習筆記

《文獻管理與資訊分析》課程學習 教材學習內容總結 資訊社會面對的挑戰 隨著社會的發展歷程的加速,資訊獲取更加方便快捷 社會的進步是一部資訊儲存和傳播方式變革的歷史 資訊的海量增加、資訊更新加快,我們獲得的相對知識是在減少的 資訊社會該如何學習 學

掌握好寫js程式碼相應的除錯工具之——火狐除錯工具-DevTools

咱們做寫js程式碼的時候,遇到的一個最大的問題就是除錯問題,很多開發者在寫js程式碼的時候,經常都非常痛苦。但是我們如果掌握好相應的除錯工具,那麼就可以比較遊刃有餘的解決js的除錯問題。工欲善其事,必先利其器。

Linux GCCGDB除錯

1.gcc如果加-c選項僅編譯(compile),只會生成xxx.o gcc -c main.c gcc -c main.c -o main.o如果加上-o選項,則生成可執行檔案 gcc -o main.out main.o #將main.o連結成可執行檔案main.

gdb除錯過程學習

說明: next(n)表示:命令是next,n是縮寫命令與引數之間有一個空格 除錯執行環境相關命令 1、set args 可指定執行時引數。(如:set args 10 20 30 40 50 )  2、show args 命令可以檢視設定好的執行引數。  3、ru

【測試工具】-效能測試-GT學習筆記

安卓/IOS手機端調測元件,用於安卓平臺的效能測試、競品測試及僅憑一臺手機進行App測試的場景。GT(隨身調)是APP的隨身調測平臺,它是直接執行在手機上的“整合調測環境”(IDTE, Integrated Debug&Test Environment)。 利用GT,僅憑一部手機,無需連線電腦,您即可