1. 程式人生 > >Linux下偵錯程式GDB、makefile的使用

Linux下偵錯程式GDB、makefile的使用

 

前面的幾篇部落格中我們講解了Linux下的編輯器vim、編譯器gcc和g++,今天我們來介紹一下其他常用的三種工具,它們分別是程式偵錯程式:GDB、程式碼檢視器:ctags、還有一個輔助工程的工具:Makefile
程式偵錯程式:GDB

在windos下我們常用vs編輯器中自帶的除錯工具進行程式的除錯,對於程式設計師來說,除錯自己寫的程式時必須的;在Linux中,我們可以使用GDB來除錯已經編譯好的可執行程式;注意,一定是已經編譯好的程式,下面來看看GDB使用除錯的注意事項以及相關按鍵:
這裡寫圖片描述

    如上圖,首先用gdb除錯的可執行程式檔案必須含有相應的除錯資訊,在用gcc編譯時我們需要在gcc指令的後面加上-g標誌,在下面的資訊中,下面的檔案大小中含有除錯資訊的檔案的大小是比不含除錯資訊的檔案要大。
    下面,我們使用 gdb + 含有除錯資訊的可執行程式進入除錯階段,如下圖:
    這裡寫圖片描述
    在開始單步執行時我們必須要先打上斷點,因為我們在單步執行之間必須先執行程式,如果不打上斷點,程式會直接跑完,這時非常尷尬的。
    這需要我們記住gdb的兩個指令:
    r : 開始執行程式
    b + n:表示在第n行打下斷點(n為數字)
    這裡寫圖片描述

下面我們就可以來除錯程式了,除錯程式的過程中,我們需要記住幾個最基本的指令:
n:單步執行程式
s:跳轉到函式的入口地址
p:列印變數的值
我們來通過一次除錯看看這些命令是如何使用的:
這裡寫圖片描述
其他的一些重要命令

display + 變數名:將該變數的內容常顯示,即在變數的作用域中每次單步執行都會看到該變數的內容,對我們觀察變數的內容的改變情況十分有幫助.
undisplay + n:取消顯示列表中的號碼n所對應的變數內容的常顯示。
這裡寫圖片描述

set var x=n:將變數x的內容修改為n,這樣做可以輔助我們除錯程式,比方說我們先看到start=8;end=8;時程式的執行結果,我們就可以通過該命令直接修改變數的內容,這樣可以使我們少單步執行幾次程式就能得到我們想看到的結果。
這裡寫圖片描述

關於斷點除了前面的幾條命令外還有下面幾條比較重要的命令:

info b num:檢視第num個編號的斷點的當前資訊
info b:檢視所有斷點的資訊
delete breakpoints:刪除所有斷點
delete breakpoints num:刪除序號為num的斷點
disable num:禁用序號為num的斷點
enable num :啟用序號為num的斷點

下面我們來看看這些命令的使用:

這裡寫圖片描述
其他有助於除錯的命令

continue :從當前位置繼續向後執行而不是單步執行程式。
finish 執行完當前函式返回,然後原地“踏步”等待命令。
until n:直接跳轉至第n行
Makefile

    一個程式設計師會不會寫Makefile,決定了這個程式設計師具不具備在Linux下完成大型工程的能力,因為,makefile關係到了整個工程的編譯規則。一個工程中的原始檔不計數,其按型別、功能、模組分別放在若干個目錄中,makefile定義了一系列的規則來指定,哪些檔案需要先編譯,哪些檔案需要後編譯,哪些檔案需要重新編譯,甚至於進行更復雜的功能操作,因為makefile就像一個Shell指令碼一樣,其中也可以執行作業系統的命令。makefile帶來的好處就是——“自動化編譯”,一旦寫好,只需要一個make命令,整個工程完全自動編譯,極大的提高了軟體開發的效率。make是一個命令工具,是一個解釋makefile中指令的命令工具,一般來說,大多數的IDE都有這個命令,比如:Delphi的make,Visual
    C++的nmake,Linux下GNU的make。可見,makefile都成為了一種在工程方面的編譯方法。

首先,我們來實現一個簡單的Makefile,順便講解一下Makefile的語法。
場景如下:
在一個資料夾下面,我們已經寫好了標頭檔案,函式檔案,以及測試檔案,如果我們將函式檔案和測試檔案都進行編譯並且我們需要檢視編譯過程中各個階段所生成的檔案,那樣我們需要敲好多條命令,如果我們改寫了函式檔案或者測試檔案的程式,那麼這些步驟需要再來一次,這樣會很繁瑣,而當我們編寫好了Makefile檔案後,這些指令統統只需要一個make就能夠搞定,下面我們來看一個簡單的Makefile的實現:
這裡寫圖片描述

target : preproity
/Tab command
上面的命令是Makefile的基本語法,target可以是文字檔案,也可以是可執行檔案,還可以是一個標籤,這種標籤就相當於上圖中的偽指令clean,它沒有preproity這一項。
target檔案的生成規則定義在解決方法command中,如果target比preproity檔案的時間要新的話則會執行command,否則會繼續向上查詢preproity的依賴檔案,直到找到符合規則,並且最新的為止。這是Makefile的主線和核心,大家如果想深入瞭解的可以去看看下面這篇部落格:
http://blog.csdn.net/ruglcc/article/details/7814546/

關於C語言和C++語言的編譯這個過程,大家可以看看下面這篇部落格:
http://blog.csdn.net/bit_clearoff/article/details/53965514
---------------------  
作者:_stark  
來源:CSDN  
原文:https://blog.csdn.net/bit_clearoff/article/details/53966718  
版權宣告:本文為博主原創文章,轉載請附上博文連結!