makefile和gdb除錯
gdb除錯
gdb是一個由GNU開源組織釋出的、UNIX/LINUX作業系統下的、基於命令列的、功能強大的程式除錯工具,其中對於gdb的除錯是所有在Linux作業系統下進行開發人員必備的知識
程式示例:
#只有新增 -g選項才能表示能夠除錯
g++ -g ./pointer1.cpp -o ./pointer1.out
gdb ./pointer1.out #指定pointer1.out為需要除錯的程式
gbd l 表示顯示原始碼
gdb start表示開始除錯
p a 表示檢視 a 的值
n 表示下一步
s 表示進入函式檢視
bt 檢視函式棧
f 1 表示跳入棧1
q 退出除錯
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-efTFL4HX-1608474392496)(Untitled.assets/image-20201220222344303.png)]
一般我們將記憶體分為:堆區、棧區、全域性區、程式碼區、常量區,各個區域存放的內容:
棧區:在程式中所建立的區域性變數、引數、陣列、指標等,當程式執行完後,將釋放所佔用的該塊記憶體。
堆區:該片區域中存放著我們手工申請的內容,如:Malloc、new所建立。
全域性區:全域性變數、靜態變數,在我們程式執行完之後將自動釋放所佔用的記憶體。
程式碼區:存放著函式體的二進位制程式碼。
常量區:包含著整形常量、字串常量,該區域內容不能被修改。
makeFile編寫
一個大型工程中的原始檔不計其數,其按型別、功能、模組分別放在若干個目錄中,makefile定義了一系列的規則來指定哪些檔案需要先編譯,能夠清晰的指定,哪些檔案需要後編譯,哪些檔案需要重新編譯,甚至於進行更復雜的功能操作。
1.1 make命令的使用
make[option] [target]
-Cdir :在讀入makefile之前,把路徑切換到dir下。如果同時使用幾個‘-C’選項,則eachis interpreted relative to the previous one。
-d :在正常處理後列印除錯資訊。
-e :設定環境變數的優先權高於makefile檔案變數的優先權。
-ffile :將file設定為makefile檔案。
-i :忽略在執行重建檔案命令時產生的所有錯誤。
-Idir :指定搜尋makefile檔案的路徑。如果同時使用幾個‘-I’選項,則按照次序搜尋這些路徑。
-k :在出現錯誤後,儘可能的繼續執行。也就是說當一個目標建立失敗後,所有依靠它的目標檔案將不能重建,而這些目標的其它依賴則可繼續處理。
-n :列印要執行的命令,但卻不執行它們。
-ofile :即使檔案file比它的依賴舊,也不重建該檔案。
-p :列印資料庫,其中的資料來自讀入makefile檔案的結果;列印之後執行。
make –qp 列印資料庫後不執行。
make –p –f/dev/null 列印預定義的規則和變數的資料庫。
-q :不列印也不執行命令。如果所有目標都已經更新到最新,make的退出狀態是0;如果一部分需要更新,退出狀態是1;如果make遇到錯誤,退出狀態是2。
-r :禁止使用預定義的隱含規則,同時也清除了預設的字尾列表和字尾規則。注意預設的變數仍然有效。
-R :禁止使用內建的規則變數。‘-R’自動使‘-r’生效。
-s :不回顯執行的命令。
-S :使‘-k’失效。除非在遞迴呼叫make時,通過變數MAKEFLAGS從上層make繼承‘-k’,或環境中設定了選項‘-k’,否則沒有必要使用該選項。
-t :標記檔案已經更新到最新,但實際卻沒有更新它們。
-w :列印執行makefile檔案時涉及的所有工作目錄。
-Wfile :Pretendthat the file has been just modified。在和‘-n’一起使用時,將表明更改該檔案會發生什麼。如果沒有和‘-n’一起使用,那麼它和在執行make之前對該檔案使用touch命令的結果幾乎一樣,但使用該選項make只是在想象中更改該檔案的時間戳。