1. 程式人生 > >如何檢測記憶體洩露

如何檢測記憶體洩露

1.採用定製話的malloc和free 每次申請空間都 呼叫自己的其實也就是加了計數器開闢記憶體+1 釋放記憶體-1最後看計數器是不是0是的話就沒有不是的話就是有;

具體程式碼不列出

缺點每次使用都需要人工去檢視並且不能確定定位是哪裡的沒有釋放

採用工具(具體linux下的)

mtrace-----

  下面, 我們來看看程式:

  1. #include <stdio.h>
  2. int main()  
  3. {  
  4.         setenv("MALLOC_TRACE""taoge.log""1");  
  5.         mtrace();  
  6.         int *p = (
    int *)malloc(2 * sizeof(int));  
  7.         return 0;  
  8. }  
       有的朋友要說了, 一眼就能看出記憶體洩露啊。 但是, 當程式大了之後, 怎能僅僅依靠肉眼? 好, mtrace該出場了。

        編譯:gcc -g a test.c   (千萬要注意, -g不可漏掉, 否則, 雖然最後能定位到記憶體洩露, 但卻找不到在程式碼的第幾行。控制,

        執行:./a.out

        定位:mtrace a output2.log

        結果:

       可以看到, 有記憶體洩露,且正確定位到了程式碼的行數。

       我們想一下mtrace函式/命令的原理, 其實也很簡單, 無非就是記錄每一對malloc/free的呼叫情況, 從這個意義上來講, mtrace替代了部分我們的眼睛, 緊緊地盯著malloc/free, 所以能看到洩露還是不洩露啊。


相關推薦

Linux檢測記憶體洩露的指令碼

1.針對應用場景下的記憶體洩露 mm-leak-app.sh #!/bin/sh if [ $# -ne 1 ]; then echo "Usage: `basename $0` process_name" exit 1 fi APPNAME=$1 PR

使用_CrtSetDbgFlag檢測記憶體洩露

介紹: 動態分配、回收記憶體是C/C++程式語言一個最強的特點,但是中國哲學家孫(Sun Tzu,我不知道是誰?那位知道?)指出,最強的同時也是最弱的。這句話對C/C++應用來說非常正確,在記憶體處理出錯的地方通常就是BUGS產生的地方。一個最敏感和難檢測的BUG就是記憶體洩漏-沒有把前邊分配的記憶體成功釋

使用Android Studio檢測記憶體洩露

記憶體洩露,是Android開發者最頭疼的事。可能一處小小的記憶體洩露,都可能是毀千里之堤的蟻穴。 怎麼才能檢測記憶體洩露呢? AndroidStudio 中Memory控制元件臺(顯示器)提供了一個記憶體監視器。我們可以通過它方便地檢視應用程式的效能和記憶體

Windows下C++軟體除錯——檢測記憶體洩露

前言 之前在面一家公司的時候被問及到:當你接收同事的專案,專案之中可能存在記憶體洩露,而且程式碼能夠正常的執行不會報錯。在這種情況下找出該專案中可能存在的記憶體洩露問題(比如原同事只new了但是沒有d

如何檢測記憶體洩露,如何進行記憶體優化? 【面試題】

如何檢測記憶體洩露,如何進行記憶體優化?     答:RAM和ROM 是什麼?   記憶體溢位更多的再java記憶體中。 Android系統為每一個應用程式都設定了一個硬性的DalvikHeap Size最大限制閾值,這個閾值在不同的裝置上會

iOS開發記憶體優化之自動檢測記憶體洩露,檢查是否有迴圈引用,檢查記憶體為何如此大,Block迴圈引用的檢查

手機裝置的記憶體是一個共享資源。應用程式可能會不當的耗盡記憶體、崩潰,或者遭遇大幅度的效能降低。 Facebook iOS客戶端有很多功能,並且它們共享同一塊記憶體空間。如果任何特定的功能消耗過多的記憶體,就會影響到整個應用程式。這是可能發生的,比如,這個功能導致了記

如何在vs下linux下檢測記憶體洩露

1、記憶體洩漏簡介2、Windows平臺下的記憶體洩漏檢測 2.1、檢測是否存在記憶體洩漏問題2.2、定位具體的記憶體洩漏地方 3、Linux平臺下的記憶體洩漏檢測 4、總結 其實Windows、Linux下面的記憶體檢測都可以單獨開篇詳細介紹,方法和工

如何檢測記憶體洩露

1.採用定製話的malloc和free 每次申請空間都 呼叫自己的其實也就是加了計數器開闢記憶體+1 釋放記憶體-1最後看計數器是不是0是的話就沒有不是的話就是有; 具體程式碼不列出 缺點每次使用都需

gperftools工具檢測記憶體洩露

gperftools是google開發的一款非常實用的工具集,主要包括:效能優異的malloc free記憶體分配器tcmalloc;基於tcmalloc的堆記憶體檢測和記憶體洩漏分析工具heap-profiler,heap-checker;基於tcmalloc實現的程式CP

Android 使用LeakCanary 檢測記憶體洩露

LeakCanary 是 Android 和 Java 記憶體洩露檢測框架,該框架是Square公司的一個開源庫,專案地址 leakcanary 。 Android 開發中你是否頻頻遇到記憶體洩露而無奈無從解決。說不定哪天你不小心寫的一行程式碼就導致了記憶體洩

Xcode8 檢測記憶體洩露

xcode8_new.pngSource Editing 主要可說的而是官方整合XCode外掛開發,總算有了一個具體的規範,蘋果拿來主義也是毫不含糊,在XCode的/Applications/Xcode-beta.app/Contents/PlugIns/XCDocument

C++記憶體管理之一(檢測記憶體洩露) 轉

_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );該語句在程式退出時自動呼叫 _CrtDumpMemoryLeaks。必須同時設定 _CRTDBG_ALLOC_MEM_DF 和 _CRTDBG_LEAK_CHECK_DF.這樣,該版

使用新版Android Studio檢測記憶體洩露和效能

記憶體洩露,是Android開發者最頭疼的事。可能一處小小的記憶體洩露,都可能是毀於千里之堤的蟻穴。 怎麼才能檢測記憶體洩露呢?網上教程非常多,不過很多都是使用Eclipse檢測的, 其實1.3版本以後的Android Studio 檢測記憶體非常方便, 如果結合上MAT工具,LeakCanary外掛,一

Linux核心的Kmemleak實現記憶體洩露檢測

1. Kmemleak的使用方法     a. 在uboot的bootarg中加入"kmemleak=on"     b. 在.config中使能如下配置 CONFIG_HAVE_DEBUG_KMEMLEAK=y CONFIG_DEBUG_KMEMLEAK=y CONFIG_

記憶體溢位與記憶體洩露的區別與聯絡,如何檢測、解決

記憶體溢位 out of memory,是指程式在申請記憶體時,沒有足夠的記憶體空間供其使用,出現out of memory;比如申請了一個integer,但給它存了long才能存下的數,那就是記憶體溢位 記憶體洩露 memory leak,是指程式在申請記

Android Native記憶體洩露檢測(針對Android7.0)

1. 需要合入一個 Patch 2. 執行指令 adb root adb shell setprop libc.debug.malloc.program cameraserver adb shell setprop libc.debug.malloc.options “backt

VS:define_CRTDBG_MAP_ALLOC巨集檢測windows上的code是否有記憶體洩露

VS中自帶記憶體洩露檢測工具,若要啟用記憶體洩露檢測,則在程式中新增以下語句: #define _CRTDBG_MAP_ALLOC #include <crtdbg.h> _CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) | _

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

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

DevPartner Studio Professional Edition 11 記憶體洩露檢測使用

                     DevPartner Studio Professional Edition含有靜態程式碼分析、錯誤檢測、效能、覆蓋率和記憶體分析以及效能專家功能,用於 Visual Studio 2012、Visual Studio 2010、Visual Studio 2008

Windows平臺下如何檢測C/C++記憶體洩露

對於C/C++程式設計師來說,效率和優雅性大多數情況是對立的,我們經常會在這裡面抉擇,到底應該怎麼取捨。而說到效率,就不得不說讓這類程式設計師頭疼了N年的問題,記憶體洩露,至少從C/C++發明以來很多人都在頭疼。而Java/C#之類的語言並不存在這種問題,因為他們從堆中申請記憶體,根據引用計數等(據說有六種方