Linux下偵錯程式GDB makefile的使用

2021-08-31 09:35:18 字數 2433 閱讀 2017

前面的幾篇部落格中我們講解了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的主線和核心,大家如果想深入了解的可以去看看下面這篇部落格:

Linux偵錯程式 gdb使用

1.背景 程式的發布方式有兩種,debug模式和release模式 linux gcc g 出來的二進位制程式,預設是release模式 要使用gdb除錯,必須在源 生成二進位制程式的時候,加上 g選項 2.開始使用 gdb binfile 退出 ctrl d 或quit除錯命令 list l 行號...

python的偵錯程式 Python 偵錯程式入門

python 生態系統包含豐富的工具和庫,可以讓開發人員更加舒適。例如,我們之前已經介紹了如何使用互動式 shell 增強 python。本文重點介紹另一種可以節省時間並提高 python 技能的工具 python 偵錯程式。python 偵錯程式 python 標準庫提供了乙個名為 pdb 的偵錯...

常見偵錯程式

工欲善其事,必先利其器 在進行軟體除錯或者逆向工程時,我們需要很多輔助工具,其中偵錯程式是最重要的工具之一。根據除錯物件偵錯程式分類為使用者態和核心態。使用者態偵錯程式只能除錯環3 ring3 許可權的應用程式,大多數應用程式均屬於此類程式。核心態偵錯程式能除錯環0 ring0 許可權的應用程式,驅...