1. 程式人生 > >Windows/Linux下C/C++記憶體洩露檢測工具

Windows/Linux下C/C++記憶體洩露檢測工具

一 Window下的記憶體洩露檢測(以VC++環境為例)

靈活自由是C語言的一大特色,但這個特色也難以避免的帶來一些副作用,比如記憶體洩露。眾所周知,記憶體洩露的問題比較複雜,程式正常執行時你看不出它有任何異常,但長時間執行或在特定條件下特定操作重複多次時,它才暴露出來。所以,記憶體洩露往往是難以發現,也難以定位解決的。

Visual Leak Detector(VLD)是一款用於Visual C++的免費的記憶體洩露檢測工具,使用者可從http://www.codeproject.com/tools/visualleakdetector.asp下載,該軟體以庫形式與使用者的被測工程一起使用,由於VLD是按LGPL(GNU LESSER GENERAL PUBLIC LICENSE)協議對外開源,所以使用VLD是安全的,不必擔心版權問題。

使用VLD

先從網站下載VLD的zip包,當前最高版本是V1.0,解壓後得到vld.h、vldapi.h、vld.lib、vldmt.lib、vldmtdll.lib、dbghelp.dll等檔案,把這些所有.h標頭檔案拷貝到VC預設的include目錄下,將所有.lib檔案拷貝到VC預設的lib目錄下,安裝工作就完成了。

使用VLD很簡單,只須在包含入口函式的CPP或C檔案中把vld.h標頭檔案包含進來即可。該include語句要求放在最前面,如果當前工程定義預編譯head檔案(如stdafx.h),則放在“#include <stdafx.h>”語句之後就可以了。之後正常編譯、按Debug方式執行被測程式,等程式執行結束時,查閱VC的output視窗,會有“Visual Leak Detector is now exiting.”一句列印資訊,在這條件資訊之前,如果當前程式沒有記憶體洩露會有“No memory leaks detected.”資訊列印,但如果有記憶體洩露,將有類似如下資訊列印:

    C:/VcTester21/sample/vc6/SampleMain.c (80): main

    crt0.c (206): mainCRTStartup

    0x7C816FD7 (File and line number not available): RegisterWaitForInputIdle

  Data:

      CD CD CD CD    CD                    ........ ........

Visual Leak Detector detected 1 memory leak.

這個資訊指明當前發生記憶體洩露所在的函式及原始檔行號,洩露記憶體塊的地址、長度及當前記憶體值。用滑鼠雙擊指示原始碼行的提示資訊,VC即自動跳轉到相應程式碼行,我們就很方便的知道是哪一行出錯了。

可以看出,VLD用起來很簡單,對它的實現原理感興趣的朋友可以閱讀VLD原始碼,也可參考dofty的文章:使用Visual Leak Detector檢測記憶體洩露

二 Linux下的記憶體洩露檢測(valgrind)

Valgrind 是在linux系統下開發應用程式時用於除錯記憶體問題的工具。它尤其擅長髮現記憶體管理的問題,它可以檢查程式執行時的記憶體洩漏問題。

以上內容收集自Internet

   按照裡面的README提示,採用標準gnu軟體安裝方式,./configure — make —- makeinstall,安裝後,輸入valgrind ls -l 驗證一下該工具是否工作正常(這是README裡面的方法,實際上是驗證一下對ls -l命令的記憶體檢測),如果你看到一堆的資訊說明你的工具可以使用了。

初次使用

編譯如下程式碼: gcc -Wall example.c -g -o example

#include <stdlib.h>void f(void){ int* x = malloc(10 * sizeof(int)); x[10] = 0; // problem 1: heap block overrun} // problem 2: memory leak -- x not freedint main(void){ f(); return 0;}

     注意:gcc 的-g 選項讓Valgrind除錯輸出時指出相應資訊的程式碼所在的行號。

valgrind --tool=memcheck --leak-check=yes ./example
==6742== Memcheck, a memory error detector for x86-linux.

==6742== Copyright (C) 2002-2004, and GNU GPL'd, by Julian Seward et al.

==6742== Using valgrind-2.2.0, a program supervision framework for x86-linux.

==6742== Copyright (C) 2000-2004, and GNU GPL'd, by Julian Seward et al.

==6742== For more details, rerun with: -v

==6742==

==6742== Invalid write of size 4

==6742==    at 0x8048384: f (example.c:6)

==6742==    by 0x80483AC: main (example.c:12)

==6742== Address 0x1B908050 is 0 bytes after a block of size 40 alloc'd

==6742==    at 0x1B904984: malloc (vg_replace_malloc.c:131)

==6742==    by 0x8048377: f (example.c:5)

==6742==    by 0x80483AC: main (example.c:12)

==6742==

==6742== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 12 from 1)

==6742== malloc/free: in use at exit: 40 bytes in 1 blocks.

==6742== malloc/free: 1 allocs, 0 frees, 40 bytes allocated.

==6742== For counts of detected errors, rerun with: -v

==6742== searching for pointers to 1 not-freed blocks.

==6742== checked 1360800 bytes.

==6742==

==6742==

==6742== 40 bytes in 1 blocks are definitely lost in loss record 1 of 1

==6742==    at 0x1B904984: malloc (vg_replace_malloc.c:131)

==6742==    by 0x8048377: f (example.c:5)

==6742==    by 0x80483AC: main (example.c:12)

==6742==

==6742== LEAK SUMMARY:

==6742==    definitely lost: 40 bytes in 1 blocks.

==6742==    possibly lost:   0 bytes in 0 blocks.

==6742==    still reachable: 0 bytes in 0 blocks.

==6742==         suppressed: 0 bytes in 0 blocks.

==6742== Reachable blocks (those to which a pointer was found) are not shown.

==6742== To see them, rerun with: --show-reachable=yes

   上面的C程式存在兩個錯誤:1. 陣列下標越界;2. 分配的記憶體沒有釋放,存在記憶體洩露的問題。對於錯誤1,看Valgrind的除錯資訊片斷

==6742== Invalid write of size 4

==6742==    at 0x8048384: f (example.c:6)

==6742==    by 0x80483AC: main (example.c:12)

==6742== Address 0x1B908050 is 0 bytes after a block of size 40 alloc'd

==6742==    at 0x1B904984: malloc (vg_replace_malloc.c:131)

==6742==    by 0x8048377: f (example.c:5)

對於錯誤2,看這個

==6742== malloc/free: 1 allocs, 0 frees, 40 bytes allocated.

......

==6742== 40 bytes in 1 blocks are definitely lost in loss record 1 of 1

==6742==    at 0x1B904984: malloc (vg_replace_malloc.c:131)

==6742==    by 0x8048377: f (example.c:5)

==6742==    by 0x80483AC: main (example.c:12)

相關推薦

Linux C 程式設計記憶體洩露檢測工具(二):memwatch

Memwatch簡介 在三種檢測工具當中,設定最簡單的算是memwatch,和dmalloc一樣,它能檢測未釋放的記憶體、同一段記憶體被釋放多次、位址存取錯誤及不當使用未分配之記憶體區域。請往http://www.linkdata.se/sourcecode.html下載最

Windows/LinuxC/C++記憶體洩露檢測工具

一 Window下的記憶體洩露檢測(以VC++環境為例) 靈活自由是C語言的一大特色,但這個特色也難以避免的帶來一些副作用,比如記憶體洩露。眾所周知,記憶體洩露的問題比較複雜,程式正常執行時你看不出它有任何異常,但長時間執行或在特定條件下特定操作重複多次時,它才暴露出來。所

MacC++記憶體洩露檢測工具

1) nvwa(寓意女媧補天,從sourceforge下載),直接將其程式碼編譯到工程中,發現有洩露後程序即終止; nvwa能夠檢測到記憶體洩露問題,但是試用後感覺不穩定 2) leaks命令,能確

linux記憶體洩露檢測工具Valgrind介紹

一、工作中一個記憶體洩漏問題的解決過程: 問題背景:我司裝置上執行有多個程序,在裝置執行兩天後,程序jsman所佔用的記憶體達到了1200M bytes(通過ps -aux檢視)。 解決步驟: 確定裝置上的軟體版本,根據git的commit號資訊回退

UnixC程式記憶體洩漏檢測工具Valgrind安裝與使用

                Valgrind是一款用於記憶體除錯、記憶體洩漏檢測以及效能分析的軟體開發工具。 Valgrind的最初作者是Julian Seward,他於2006年由於在開發Valgrind上的工作獲得了第二屆Google-O'Reilly開原始碼獎。 Valgrind遵守GNU通用公共許

Visual C++ 記憶體洩露檢測工具(VLD)

簡述 C/C++ 程式越複雜,記憶體的管理顯得越重要,稍有不慎就會出現洩漏。如果記憶體洩漏不是很嚴重,在短時間內對程式不會有太大影響,這也使得記憶體洩漏問題有很強的隱蔽性,不易被發現。然而不管記憶體洩漏多麼輕微,當程式長時間執行時,其破壞力是驚人的 - 從效能

C語言記憶體洩露檢測--Memwatch

專案:迅雷下載庫記憶體洩露檢測 作者:曾金龍 供職:深圳迅雷網路技術股份有限公司 領域:迅雷下載庫 時間:2014-07-26 迅雷的移動下載庫是用C語言編寫的,為了能夠橫跨歐亞非拉(ios,android,還有諾基亞的什麼系統來著,對了symban)和效能,我們廠的下載

C/C++的記憶體洩漏檢測工具Valgrind memcheck的使用經歷

 Linux下的Valgrind真是利器啊(不知道Valgrind的請自覺檢視參考文獻(1)(2)),幫我找出了不少C++中的記憶體管理錯誤,前一陣子還在糾結為什麼VS 2013下執行良好的程式到了Linux下用g++編譯執行卻崩潰了,給出一堆彙編程式碼也看不懂。久久不

Linux中的常用記憶體問題檢測工具

C/C++等底層語言在提供強大功能及效能的同時,其靈活的記憶體訪問也帶來了各種糾結的問題。如果crash的地方正是記憶體使用錯誤的地方,說明你人品好。如果crash的地方記憶體明顯不是

精準 iOS 記憶體洩露檢測工具----MLeaksFinder

背景 平常我們都會用 Instrument 的 Leaks / Allocations 或其他一些開源庫進行記憶體洩露的排查,但它們都存在各種問題和不便,我們逐個來看這些工具的使用和存在的問題。 Leaks 先看看 Leaks,從蘋果的開發者文件裡可以看到,一個 app 的記憶體分三類:

Android記憶體洩露檢測工具和實際開發中遇到的記憶體洩露問題解析

介紹 記憶體洩露是平常開發中經常遇到的,有些時候稍不注意就會發生,而且還不易察覺,這就需要工具來幫助檢測。本文主要介紹記憶體檢測工具和我在開發中遇到的記憶體洩露問題和解決方案。 記憶體洩露的原理 具體的原理涉及到虛擬機器垃圾回收機制知識,這裡只為下文作

iOS-記憶體洩露檢測工具(MLeaksFinder)

MLeaksFinder MLeaksFinder helps you find memory leaks in your iOS apps at develop time. It can automatically find leaks in UIVi

初識記憶體洩露檢測工具VisualLeakDetector

VLD為vc++下的記憶體洩露檢測工具 1、首先下載安裝vld,直接下載安裝包,安裝過程中會直接新增環境變數。 2、在安裝目錄下有vld.h, vldapi.h, vld.lib, vldmt.lib, vldmtdll.lib, dbghelp.dll等檔

記憶體洩露檢測工具比較

1.     ccmalloc-Linux和Solaris下對C和C++程式的簡單的使用記憶體洩漏和malloc除錯庫。 2.     Dmalloc-Debug Malloc Library. 3.     Electric Fence-Linux分發版中

Wince記憶體洩露檢測工具Application Verifier的使用和如何快速定位洩露語句(二)

通過Application Verifier在wince端生成日誌檔案後,我們將檔案拷貝到PC上通過PC端的工具進行日誌分析,我們就可以定位出洩漏地址的程式碼行位置了,這裡有個前提條件,那就是需要我們在編譯程式時將程式的除錯資訊開啟,VS2008設定選項配置方法如下: 1.

記憶體洩露檢測工具Valgrind

記憶體洩露簡介 什麼是記憶體洩漏   記憶體洩漏(Memory Leak)是指程式中已動態分配的堆記憶體由於某種原因,程式未釋放或無法釋放,造成系統記憶體的浪費,導致程式執行速度減慢甚至系統崩潰等嚴重後果。  記憶體洩漏缺陷具有隱蔽性、積累性的特徵,比其他記憶體非法訪問錯誤更難檢測。因為記憶體洩漏的產生原

linux C記憶體洩露檢測實現及記憶體洩露檢測的一般方法

linux中,由於使用malloc或alloc而沒有free掉申請的記憶體,就會造成記憶體的洩露。通常,來講為了避免記憶體洩露的情況出現,一般要求,我們儘量的malloc之後,呼叫free。但是總會有忘記free的時候啊。一般可以有如下幾種方式來避免記憶體洩露: 1) 

c++記憶體洩露檢測

// 以下程式碼在vs2013上面測試#include <stdlib.h> #include <crtdbg.h> // 在入口函式中包含 _CrtDumpMemoryLeaks(); // 即可檢測到記憶體洩露 typedef void* HObjec

Linux利用Valgrind工具進行記憶體洩露檢測和效能分析

Valgrind通常用來成分析程式效能及程式中的記憶體洩露錯誤 一 Valgrind工具集簡紹 Valgrind包含下列工具:     1、memcheck:檢查程式中的記憶體問題,如洩漏、越界、非法指標等。     2、callgrind:檢測程式程式碼的執行

使用Visual Leak Detector for Visual C++ 捕捉記憶體洩露---Visual C++記憶體洩露檢測—VLD工具使用說明

以下經過測試: 使用Visual Leak Detector for Visual C++ 捕捉記憶體洩露 1、下載vlc 2、建立應用並配置 c/c++ -> General -> Additional Include Directories = C:\P