除錯記憶體 C C 程式除錯和記憶體檢測

2021-10-14 19:33:53 字數 1704 閱讀 9689

程式出現錯誤很正常,乙個優秀的程式設計師必須學會除錯,發現錯誤並改正。減少程式錯誤最有效的方法是:在敲**之前,多花點時間思考,如何構造程式,資料結構和演算法,盡量把細節提前寫下來,可以嘗試著在紙上寫出核心**,這樣可以減少今後修改**的時間。

(1)**檢查,重新閱讀程式,排除比較明顯的錯誤。編譯時帶上-wall引數,生成所有的警告資訊。

gcc -wall -pedantic -ansi   表示以ansi/iso生成所有的警告西資訊。

例如:

#ifdef debug

std::cout <  #endif

程式編譯時可以選擇性的加上-ddebug。如果加上這個標誌,就定義了debug這個符號,從而在程式中包含除錯用的額外**,沒有加上該標誌,這些除錯**將刪除。

(3)程式的受控執行。用偵錯程式來控制**的執行,隨時檢視這些變數的狀態。

為了能夠除錯程式,需要在編譯和鏈結時為每個原始檔加上編譯選項引數。這些選項的作用是讓編譯器在程式中新增額外的除錯資訊。這些資訊包括符號和源**行號,偵錯程式將利用這些資訊向使用者顯示程式已經執行到的源**的位置。-g標誌是對程式除錯性編譯時常用的乙個選項。除錯資訊的加入使可執行程式的長度成倍的增長、容量增加,程式執行時的記憶體數量還是和原來一樣,程式除錯結束後,最好還是將除錯資訊從程式的發行版中刪除。

常用功能命令:

g++ -g -o test test.cpp  //編譯時加上-g引數

1、啟動gdb:gdb test

2、help

3、具備帶有歷史記錄的命令列編輯功能,方向鍵選擇之前執行過的命令,直接回車鍵再次執行最近執行過的那條命令。單步除錯非常有用。

4、quit:退出

5、run:執行這個程式,程式執行失敗時gdb會報告失敗的原因和位置。

6、backtrace(bt):棧跟蹤,失敗時停止的位置,幫助我們找到程式到達錯誤地點的路徑。

7、print:run 後檢查變數,注意變數的生命期。

8、列印圍繞當前位置前後的一段**,繼續使用list可以顯示更多的**。

9、設定斷點,停止程式的執行,檢視變數。help breakpoint,break linenumber,cont,end,display,disable breakpoint number,clear,commands breakpointnumber.  

10、設定斷點後經常使用單步除錯命令next(n),檢視程式執行的細節。 

動態記憶體分配很容易出現程式漏洞,必須清楚自己分配的每一塊記憶體,而且要確定沒有使用已經釋放的記憶體塊,非常重要。記憶體除錯的工具有很多,這裡使用的是valgrind工具。在centos 7中直接使用 yum install valgrind 安裝。

#include 

int main()

上面簡單的**編譯執行不會發生錯誤,但是實際上發生了很嚴重的記憶體問題。ptr[3]訪問越界,std::cout <

通過valgrind工具可以檢查出來:

[xgwang@localhost desktop]$ g++ -g -o test2 test2.cpp

[xgwang@localhost desktop]$ valgrind ./test2

記憶體除錯 MEMWATCH

記憶體除錯 memwatch 2 解壓後可以看到memwatch.c memwatch.h test.c等檔案 2 1 首先執行源 中的事例程式,檢測是否捕捉到記憶體錯誤,具體步驟如下 linux and other nixes with gcc gcc o test dmemwatch dmemw...

BREW記憶體除錯

在vc上除錯brew應用時,debug視窗提示很多如和資訊 aeeheap.c 1167 表示檔案aeeheap.c的第1167行輸出的這個資訊 100 表示記憶體 存塊的大小 e dialereditform.c 346 l 表示記憶體洩漏所在檔案和行號 oemos.c 679 表示檔案oemos...

C C 程式記憶體洩漏檢測

c c 程式記憶體洩漏檢測 摺疊 1.包含標頭檔案和定義 define crtdbg map alloc include include 如果定義了 crtdbg map alloc,列印出來的是檔名和行數等更加直觀的資訊。2.方法一 在程式入口寫幾個語句 int tmpflag crtsetdbg...