Linux下調試器GDB、makefile的使用

前面的幾篇博客中我們講解了Linux下的編輯器vim、編譯器gcc和g++,今天我們來介紹一下其他常用的三種工具,它們分別是程序調試器:GDB、代碼查看器:ctags、還有一個輔助工程的工具:Makefile


程序調試器:GDB

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

  1. 如上圖,首先用gdb調試的可執行程序文件必須含有相應的調試信息,在用gcc編譯時我們需要在gcc指令的後面加上-g標誌,在下面的信息中,下面的文件大小中含有調試信息的文件的大小是比不含調試信息的文件要大。
  2. 下面,我們使用 gdb + 含有調試信息的可執行程序進入調試階段,如下圖:
    這裏寫圖片描述
  3. 在開始單步執行時我們必須要先打上斷點,因爲我們在單步執行之間必須先運行程序,如果不打上斷點,程序會直接跑完,這時非常尷尬的。
    這需要我們記住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

發佈了89 篇原創文章 · 獲贊 190 · 訪問量 21萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章