用CRT查找記憶體泄漏

来源:http://www.cnblogs.com/organic/archive/2017/11/20/7868153.html
-Advertisement-
Play Games

引用原文地址 : https://msdn.microsoft.com/en-us/library/x98tx3cf.aspx 1. 在program中嚴格按下麵順序include 2. 必須是Debug版的build Q : LiteServer遍Debug可能會遇到一些問題 A : 可以用來驗證 ...


引用原文地址

https://msdn.microsoft.com/en-us/library/x98tx3cf.aspx

 

1. 在program中嚴格按下麵順序include

  1 #define _CRTDBG_MAP_ALLOC
  2 #include <stdlib.h>
  3 #include <crtdbg.h>

 

2. 必須是Debug版的build

Q : LiteServer遍Debug可能會遇到一些問題

A : 可以用來驗證Memcheck是否有誤報。

    可以在對應的地址處下斷點(會頻繁斷在malloc上,需要根據size下條件斷點)

Q : code在Release和Debug版下可能會不一樣,最後可能會出現一個有memory leak一個沒有

 

3. "#define _CRTDBG_MAP_ALLOC"這個巨集不能省略,否則memory leak的dump會缺少一些細節(如leak的code位置信息)

 

4. 在app exit前,可以調用這個function列印memory leak report

_CrtDumpMemoryLeaks();

Q : 如果是全局或靜態obj,在exit前其還未釋放,此時report不會造成誤報嗎?

A :不會

 

5. 如果app有多個exits,你是不需要call _CrtDumpMemoryLeaks()在每個exit位置的。在app開始的位置call下麵這個_CrtSetDbgFlag(),其會自動在每個exit的位置自動call _CrtDumpMemoryLeaks()

_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );

 

6. 預設情況下,memory leak的report會在VS Studio Debug窗的Output視窗中,可以用_CrtSetReportMode()將其重定向到其他位置。

 

7. Report格式

Detected memory leaks!

Dumping objects ->

c:\users\username\documents\projects\leaktest\leaktest.cpp(20) : {18}               //{18} : memory分配序號 

normal block at 0x00780E80, 64 bytes long.                                         //64 bytes : block的大小(並不是分配時指定的大小,因為分配的heap由於會添加堆頭堆尾等額外信息,會比分配時指定的size要大) 

Data: <                > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD

Object dump complete.
 

Q : 發現即使按照第一條中的定義,也不會輸出memory leak的行信息。

A : 這個crtdbg對new處理不好,其block的地址只會new調用macro的地址,可用如下巨集DBG_NEW來替代new,以列印出對應的行信息

#ifdef _DEBUG

    #define DBG_NEW new ( _NORMAL_BLOCK , __FILE__ , __LINE__ )

    // Replace _NORMAL_BLOCK with _CLIENT_BLOCK if you want the 

    // allocations to be of _CLIENT_BLOCK type 

#else

    #define DBG_NEW new

#endif

 

Q : 需要替換所有的源碼,而且第三方庫怎麼辦?

Q : 沒有棧回溯信息,多層調用怎麼查找源頭信息?

A :  Debug,在app入口斷下後,在watch視窗輸入"_crtBreakAlloc"(如果"Runtime Library"是"/MD",則還需要添加"{,,ucrtbased.dll}_crtBreakAlloc"),這個值應該是"-1",修改成detect到的memory leak的分配序號(如7中的{18}),當分配該大小的memory時就會斷下來(註意,重跑後的條件要和第一次獲取分配序號的一致)。

    另外,在code中也可以直接指定:

_crtBreakAlloc = 18;

    or :

_CrtSetBreakAlloc(18);

 

8. Test

1> code

#include <memory>

std ::tr1 ::shared_ptr <int >   sp_nTest;

void  Test ()
{
      sp_nTest. reset( new int( 0x88));

      //memory leak
      int*  pnTest = new int( 0xCC);

      void* pMalloc = malloc( sizeof( int));
}

 

2> result

Detected memory leaks!

Dumping objects ->

d:\codes\vs2010\test\detectmemleak\console\test.cpp(14) : {65} normal block at 0x007B18A8, 4 bytes long.

Data: <    > CD CD CD CD

{64} normal block at 0x007B4F90, 4 bytes long.
Data: <    > CC 00 00 00

Object dump complete.

紅色部分是new出來的memory leak,可見並不會報出對應的code的行號


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 你全量發佈了一個新版本應用,怎麼在商戶的大面積投訴之前,率先發現閃退趨勢呢? 如果商戶投訴設備運行緩慢,你怎麼分析性能瓶頸呢?坐高鐵到現場嗎? ...
  • [20171120]關於INBOUND_CONNECT_TIMEOUT設置.txt--//上午翻看以前我的發的帖子,發現鏈接:http://www.itpub.net/thread-2066758-1-1.html--//今天再仔細看了一下,註意看了一下別人的回覆,才發現一些細節問題,原始鏈接:-- ...
  • 1.數值四捨五入,小數點後保留2位 round() 函數是四捨五入用,第一個參數是我們要被操作的數據,第二個參數是設置我們四捨五入之後小數點後顯示幾位。 numeric 函數的2個參數,第一個表示數據長度,第二個參數表示小數點後位數。 示例如下: ...
  • 環境描述:主redis:192.168.10.1 6379從redis:192.168.10.2 6380 一、主從配置 1、將主從redis配置文件redis.conf中的aemonize no 改為 yes 2、修改從redis配置文件redis.conf中的port 6379 改為 6380, ...
  • 一、Redis的誕生 Redis創建者,出生於西西里島的義大利人(antirez)發明的,個人網站,http://invece.org。早年是系統管理員,2004-2006 年做嵌入式方面的工作,之後接觸 WEB,2007 年和朋友共同創建了一個網站 LLOOGG.com,併為瞭解決這個網站的負載問 ...
  • [20171120]11G關閉直接路徑讀.txt--//今天做filesystemio_options參數測試時,遇到一個關於直接路徑讀的問題.--//如果看以前的博客介紹,設置"_serial_direct_read"=never或者events '10949 trace name context ...
  • 要使用Linux系統很重要的一個操作就是使Linux系統能夠訪問互聯網,只有Linux系統能夠訪問互聯網才能夠去下載很多自己所需要的資源,如果不能訪問互聯網那麼使用Linux系統往往會卡在這一步,假設你裝的是一個minimal版本的CentOS,那麼很多Linux系統下麵的工具都是沒有被安裝的,這個 ...
  • 第1章 批量添加3個用戶stu01-stu03,設置密碼為123456. 1.1 預備知識 前的產生的命令通過管道後可以交給bash運行 1.2 命令的樣子 目標命令的形狀,想讓命令變成這個樣子執行。 1.3 命令的生成 1.3.1 第一步 生成名字 1.3.2 第二步 拼接出想要的形狀 兩條命令之 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...