目錄
- 1.gdb背景
- 2.開始使用gdb
- 3.make/makefile 背景
- 4.實例代碼
- 5.依賴關系
- 6.依賴方法
- 7.原理
- 8.項目清理
1.gdb背景
程序的發布方式有兩種,debug模式和release模式
Linux gcc/g++出來的二進制程序,默認是release模式
要使用gdb調試,必須在源代碼生成二進制程序的時候, 加上 -g 選項
2.開始使用gdb
gdb binFile 退出: ctrl + d 或 quit 調試命令:
ist/l 行號:顯示binFile源代碼,接著上次的位置往下列,每次列10行。
list/l 函數名:列出某個函數的源代碼。
r或run:運行程序。
n 或 next:單條執行。
s或step:進入函數調用
break(b) 行號:在某一行設置斷點
break 函數名:在某個函數開頭設置斷點
info break :查看斷點信息。
finish:執行到當前函數返回,然后挺下來等待命令
print§:打印表達式的值,通過表達式可以修改變量的值或者調用函數
p 變量:打印變量值。
set var:修改變量的值
continue(或c):從當前位置開始連續而非單步執行程序
run(或r):從開始連續而非單步執行程序
delete breakpoints:刪除所有斷點
delete breakpoints n:刪除序號為n的斷點
disable breakpoints:禁用斷點
enable breakpoints:啟用斷點
info(或i) breakpoints:參看當前設置了哪些斷點
display 變量名:跟蹤查看一個變量,每次停下來都顯示它的值
undisplay:取消對先前設置的那些變量的跟蹤
until X行號:跳至X行
breaktrace(或bt):查看各級函數調用及參數
info(i) locals:查看當前棧幀局部變量的值
quit:退出gdb
3.make/makefile 背景
會不會寫makefile,從一個側面說明了一個人是否具備完成大型工程的能力
一個工程中的源文件不計數,其按類型、功能、模塊分別放在若干個目錄中,makefile定義了一系列的規則來指定,哪些文件需要先編譯,哪些文件需要后編譯,哪些文件需要重新編譯,甚至于進行更復雜的功能操作
makefile帶來的好處就是——“自動化編譯”,一旦寫好,只需要一個make命令,整個工程完全自動編譯,極大的提高了軟件開發的效率。
make是一個命令工具,是一個解釋makefile中指令的命令工具,一般來說,大多數的IDE都有這個命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可見,makefile都成為了一種在工程方面的編譯方法。
make是一條命令,makefile是一個文件,兩個搭配使用,完成項目自動化構建
4.實例代碼
#include <stdio.h>
int main()
{
printf("hello Makefile!\n");
return 0;
}
Makefile文件 hello:hello.o gcc hello.o -o hello hello.o:hello.s gcc -c hello.s -o hello.o hello.s:hello.i gcc -S
hello.i -o hello.s hello.i:hello.c gcc -E hello.c -o hello.i
.PHONY:clean
clean:
rm -f hello.i hello.s hello.o hello
5.依賴關系
上面的文件 hello ,它依賴 hell.o
hello.o , 它依賴 hello.s
hello.s , 它依賴 hello.i
hello.i , 它依賴 hello.c
6.依賴方法
gcc hello.* -option hello.* ,就是與之對應的依賴關系
7.原理
make是如何工作的,在默認的方式下,也就是我們只輸入make命令。那么
1. make會在當前目錄下找名字叫“Makefile”或“makefile”的文件。
2. 如果找到,它會找文件中的第一個目標文件(target),在上面的例子中,他會找到“hello”這個文件,
并把這個文件作為最終的目標文件。
3. 如果hello文件不存在,或是hello所依賴的后面的hello.o文件的文件修改時間要比hello這個文件新(可
以用 touch 測試),那么,他就會執行后面所定義的命令來生成hello這個文件。
4. 如果hello所依賴的hello.o文件不存在,那么make會在當前文件中找目標為hello.o文件的依賴性,如果
找到則再根據那一個規則生成hello.o文件。(這有點像一個堆棧的過程)
5. 當然,你的C文件和H文件是存在的啦,于是make會生成 hello.o 文件,然后再用 hello.o 文件聲明
make的終極任務,也就是執行文件hello了。
6. 這就是整個make的依賴性,make會一層又一層地去找文件的依賴關系,直到最終編譯出第一個目標文
件。
7. 在找尋的過程中,如果出現錯誤,比如最后被依賴的文件找不到,那么make就會直接退出,并報錯,
而對于所定義的命令的錯誤,或是編譯不成功,make根本不理。
8. make只管文件的依賴性,即,如果在我找了依賴關系之后,冒號后面的文件還是不在,那么對不起,
我就不工作啦.
8.項目清理
工程是需要被清理的
像clean這種,沒有被第一個目標文件直接或間接關聯,那么它后面所定義的命令將不會被自動執行,
不過,我們可以顯示要make執行。即命令——“make clean”,以此來清除所有的目標文件,以便重編譯。
但是一般我們這種clean的目標文件,我們將它設置為偽目標,用 .PHONY 修飾,偽目標的特性是,總是被執行的
結尾:今天的分享到此結束,喜歡的朋友如果感覺有幫助可以點贊三連支持,咱們共同進步!