国产一级一区二区_segui88久久综合9999_97久久夜色精品国产_欧美色网一区二区

掃一掃
關(guān)注微信公眾號(hào)

系統(tǒng)安全之如何搞定C++內(nèi)存泄漏
2007-01-29   

背景

C++內(nèi)存分配與釋放均由用戶代碼自行控制,靈活的機(jī)制有如潘多拉之盒,即讓程序員有了更廣的發(fā)揮

空間,也產(chǎn)生了代代相傳的內(nèi)存泄漏問題。對(duì)于新手來說,最常犯的錯(cuò)誤就是new出一個(gè)對(duì)象而忘記釋放,對(duì)于一般小應(yīng)用程序來說,一點(diǎn)內(nèi)存空間不算什么。但是當(dāng)內(nèi)存泄漏問題出現(xiàn)在需要24小時(shí)運(yùn)行的平臺(tái)類程序上的時(shí)候,將會(huì)使系統(tǒng)可用內(nèi)存飛速減少,最后耗盡系統(tǒng)資源,導(dǎo)致系統(tǒng)崩潰。

所以學(xué)會(huì)如何防止并檢查內(nèi)存泄漏,是一個(gè)合格的c++程序員必須具備的能力。但是由于內(nèi)存泄漏是程序運(yùn)行并滿足一定條件時(shí)才會(huì)發(fā)生,直接從代碼中查出泄漏原因的難度較大,而且一旦內(nèi)存泄漏發(fā)生在多線程程序中,從大量的代碼中要靠人工找出泄漏原因,無論對(duì)新人還是老手都是一場(chǎng)噩夢(mèng)

本文介紹一種在VS2003中檢查內(nèi)存泄漏的方法,供各位新人老手參考,在VC6中實(shí)現(xiàn)需要做一些變動(dòng),詳情可自行參照相關(guān)資料。

檢查策略分析

首先,假定我們需要檢測(cè)一個(gè)24小時(shí)運(yùn)行的平臺(tái)程序的內(nèi)存泄漏情況,我們無法確定具體的內(nèi)存泄漏速度,但是我們可以確定該程序在一定時(shí)間內(nèi)(如10分鐘)泄漏的內(nèi)存量是接近的,設(shè)為L(zhǎng)(eak)。

考慮在10分鐘的運(yùn)行時(shí)間內(nèi)程序新申請(qǐng)到的內(nèi)存A(lloc),這部分內(nèi)存其實(shí)包含了程序運(yùn)行正常申請(qǐng),并會(huì)在后續(xù)運(yùn)行中進(jìn)行釋放的普通內(nèi)存塊N(ormal)和泄漏的內(nèi)存L,即:A = N + L

在后續(xù)的運(yùn)行中,由于N部分不斷的申請(qǐng)和釋放,所以這部分的總量基本上是不變的,而L部分由于只申請(qǐng)而不釋放,占用的內(nèi)存總量將會(huì)越來越大。

將這個(gè)結(jié)果放到運(yùn)行時(shí)間軸上,現(xiàn)在我們觀察程序運(yùn)行中的20分鐘,我們假定內(nèi)存泄漏速度為dL/10分鐘,時(shí)間軸如下:

----------------|--------------------|-------------------|----------------------------
Tn-2 Tn-1 Tn

三點(diǎn)間隔均為10分鐘,則我們有如下結(jié)論:

Tn點(diǎn)總的內(nèi)存分配量 An = N + dL * n,N為正常分配內(nèi)存,dL*n為內(nèi)存泄漏量的總和,而Tn-1點(diǎn)的內(nèi)存總量則為 An-1 = N + dL*(n-1)。注意,我們這里不考慮釋放的內(nèi)存量,僅考慮增加的內(nèi)存量。因此很明顯單位時(shí)間內(nèi)的內(nèi)存泄漏量 dL = An - An-1。

生成內(nèi)存Dump文件的代碼實(shí)現(xiàn)

要完成如上的策略,我們首先需要能跟蹤內(nèi)存塊的分配與釋放情況,并且在運(yùn)行時(shí)將分配情況保存到文件中,以便進(jìn)行比較分析,所幸m$已經(jīng)為我們提供了一整套手段,可以方便地進(jìn)行內(nèi)存追蹤。具體實(shí)現(xiàn)步驟如下:

包含內(nèi)存追蹤所需庫(kù)

在StdAfx.h中添加如下代碼,注意必須定義宏_CRTDBG_MAP_ALLOC,否則后續(xù)dump文件將缺少內(nèi)存塊的代碼位置。

#ifdef _DEBUG
//for memory leak check
#define _CRTDBG_MAP_ALLOC //使生成的內(nèi)存dump包含內(nèi)存塊分配的具體代碼為止
#include 
#include 
#endif

啟動(dòng)內(nèi)存追蹤

上述步驟完成后,則可以在應(yīng)用程序啟動(dòng)處添加如下代碼,啟動(dòng)內(nèi)存追蹤,啟動(dòng)后程序?qū)⒆詣?dòng)檢測(cè)內(nèi)存的分配與釋放情況,并允許將結(jié)果輸出。

//enable leak check
_CrtSetDbgFlag( _CRTDBG_REPORT_FLAG);

將結(jié)果輸出指向dump文件

由于默認(rèn)情況下,內(nèi)存泄漏的dump內(nèi)容是輸出到vs的debug輸出窗口,但是對(duì)于服務(wù)類程序肯定沒法開著vs的debug模式來追蹤內(nèi)存泄漏,所以必須將dump內(nèi)容的輸出轉(zhuǎn)到dump文件中。在程序中添加如下部分:

HANDLE hLogFile;//聲明日志文件句柄
hLogFile = CreateFile("./log/memleak.log", GENERIC_WRITE, FILE_SHARE_WRITE|FILE_SHARE_READ, 
NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);//創(chuàng)建日志文件
_CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE);//將warn級(jí)別的內(nèi)容都輸出到文件(注意dump的
報(bào)告級(jí)別即為warning)
_CrtSetReportFile(_CRT_WARN, hLogFile);//將日志文件設(shè)置為告警的輸出文件

保存內(nèi)存Dump

完成了以上的設(shè)置,我們就可以在程序中添加如下代碼,輸出內(nèi)存dump到指定的dump文件中:

_CrtMemState s1, s2, s3;//定義3個(gè)臨時(shí)內(nèi)存狀態(tài)
......
_CrtDumpMemoryLeaks();//Dump從程序開始運(yùn)行到該時(shí)刻點(diǎn),已分配而未釋放的內(nèi)存,即前述An
//以下部分非必要,僅為方便后續(xù)分析增加信息
_CrtMemCheckpoint( &s2 );
if ( _CrtMemDifference( &s3, &s1, &s2) ) 
{
_CrtMemDumpStatistics( &s3 );//dump相鄰時(shí)間點(diǎn)間的內(nèi)存塊變化
//for next compare
_CrtMemCheckpoint( &s1 );
}
time_t now = time(0);
struct tm *nowTime = localtime(&now);
_RPT4(_CRT_WARN,"%02d %02d:%02d:%02d snapshot dump.\n",
nowTime->tm_mday, nowTime->tm_hour,nowTime->tm_min,nowTime->tm_sec);//輸出該次dump時(shí)間

以上代碼最好放在一個(gè)函數(shù)中由定時(shí)器定期觸發(fā),或者手動(dòng)snapshot生成相等時(shí)間段的內(nèi)存dump。

dump文件內(nèi)容示例如下:

Detected memory leaks!
Dumping objects ->
{20575884} normal block at 0x05C4C490, 87 bytes long.
Data: 02 00 1D 90 84 9F A6 89 00 00 00 00 00 00 00 00 
...
d:\xxxxx\xxxworker.cpp(903) : {20575705} normal block at 0x05D3EF90, 256 bytes long.
Data: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
...
Object dump complete.
0 bytes in 0 Free Blocks.
215968 bytes in 876 Normal Blocks.
0 bytes in 0 CRT Blocks.
0 bytes in 0 Ignore Blocks.
0 bytes in 0 Client Blocks.
Largest number used: 220044 bytes.
Total allocations: 7838322 bytes.
10 16:29:14 snapshot dump.

上面紅色部分即為用戶代碼中分配而未釋放的內(nèi)存塊位置。

解析Dump文件

前面我們已經(jīng)通過dump文件獲取到各時(shí)刻點(diǎn)的內(nèi)存dump,根據(jù)前面的分析策略,我們只需要將第n次dump的內(nèi)存塊分配情況An,與第n-1次dump內(nèi)存塊分配情況An-1作比較,即可定位到發(fā)生內(nèi)存泄漏的位置。由于dump文件一般容量巨大,*人工進(jìn)行對(duì)比幾乎不可能,所以僅介紹比較的思路,各位需要自行制作小工具進(jìn)行處理。

1、提取兩個(gè)相鄰時(shí)間點(diǎn)的dump文件D1和D2,設(shè)D1是D2之前的dump

2、各自提取dump文件中用戶代碼分配的內(nèi)存塊(即有明確代碼位置,而且為normal block的內(nèi)存塊),分別根據(jù)內(nèi)存塊ID(如“d:\xxxxx\xxxworker.cpp(903) : {20575705}”紅色部分)保存在列表L1和L2

3、遍歷列表L2,記錄內(nèi)存塊ID沒有在L1中出現(xiàn)過的內(nèi)存塊,這些內(nèi)存塊即為可能泄漏的內(nèi)存

4、根據(jù)3的結(jié)果,按照內(nèi)存的分配代碼位置,統(tǒng)計(jì)各處代碼泄漏的內(nèi)存塊個(gè)數(shù),降序排列,分配次數(shù)越多的代碼,內(nèi)存泄漏可能性越大。


熱詞搜索:

上一篇:黑客技巧之安全穩(wěn)定的實(shí)現(xiàn)進(jìn)線程監(jiān)控
下一篇:黑客技巧 打造完美遠(yuǎn)程控制軟件Radmin

分享到: 收藏
国产一级一区二区_segui88久久综合9999_97久久夜色精品国产_欧美色网一区二区
美国十次了思思久久精品导航| 亚洲少妇30p| 99久久久国产精品免费蜜臀| 亚洲成人免费av| 久久色中文字幕| 欧美视频一区二| 国产不卡免费视频| 日韩av网站免费在线| 日韩一区中文字幕| 久久综合网色—综合色88| 欧美日韩三级一区二区| 粉嫩av亚洲一区二区图片| 日韩电影在线一区| 亚洲激情图片一区| 国产精品无人区| 精品福利在线导航| 在线不卡中文字幕| 在线视频一区二区三区| www.久久精品| 国产精品资源站在线| 日本成人在线电影网| 亚洲自拍偷拍欧美| 中文字幕一区二区三区不卡| 久久精品一区蜜桃臀影院| 欧美一区二区性放荡片| 精品视频1区2区| 欧美影视一区在线| 色美美综合视频| 91农村精品一区二区在线| 粉嫩av一区二区三区| 国产成人精品免费一区二区| 国内久久婷婷综合| 黄页视频在线91| 经典一区二区三区| 韩日精品视频一区| 国产综合色在线| 国产乱妇无码大片在线观看| 国产精品一区在线观看你懂的| 久久超碰97中文字幕| 看电视剧不卡顿的网站| 精品一区二区免费看| 精品一区二区免费| 国产aⅴ综合色| 成人免费av在线| 99视频在线观看一区三区| 成人av在线资源网站| 99久久777色| 在线欧美小视频| 欧美日韩在线三区| 日韩一级免费观看| 精品国产免费视频| 日本一区二区三区dvd视频在线| 久久女同精品一区二区| 国产午夜精品理论片a级大结局| 久久这里只精品最新地址| 国产婷婷一区二区| 中文字幕一区二区三区色视频| 日韩美女久久久| 亚洲风情在线资源站| 婷婷一区二区三区| 麻豆成人免费电影| 国产一区二区三区黄视频 | 偷窥少妇高潮呻吟av久久免费| 亚洲一区二区三区四区在线观看| 亚洲国产综合在线| 另类的小说在线视频另类成人小视频在线 | 国产精品国产三级国产普通话99 | 国产精品久线在线观看| 日韩一区中文字幕| 亚洲午夜激情网站| 免费高清在线视频一区·| 国产精品中文字幕日韩精品| 成人动漫一区二区在线| 在线日韩一区二区| 欧美成人女星排名| 国产精品久久久久久久裸模| 亚洲一二三区在线观看| 久久99国产精品麻豆| av网站一区二区三区| 欧美日韩一区二区在线视频| 欧美精品一区二区高清在线观看| 国产精品网站在线观看| 亚洲第一电影网| 国产精品自在欧美一区| 一本久久a久久免费精品不卡| 91精品国产色综合久久不卡电影| 久久一日本道色综合| 一区二区三区四区在线播放| 激情综合网最新| 欧美亚洲愉拍一区二区| 久久久精品国产99久久精品芒果 | 国产大片一区二区| 欧美偷拍一区二区| 国产午夜久久久久| 美女视频网站黄色亚洲| 91国产丝袜在线播放| 久久综合九色综合欧美亚洲| 亚洲主播在线观看| 成人在线综合网站| 日韩一区二区精品在线观看| 亚洲欧美区自拍先锋| 六月丁香综合在线视频| 91福利在线播放| 欧美精彩视频一区二区三区| 蜜桃视频一区二区| 欧美在线观看一区二区| 国产欧美日韩麻豆91| 日本视频一区二区三区| 色婷婷综合久久久久中文| 久久美女艺术照精彩视频福利播放 | 亚洲精品一区二区三区精华液 | 色婷婷激情久久| 国产亚洲成av人在线观看导航| 日韩精彩视频在线观看| 色偷偷成人一区二区三区91| 日本一区二区三区四区| 国产呦精品一区二区三区网站| 欧美美女一区二区三区| 一区二区三区欧美日| av网站一区二区三区| 中文字幕 久热精品 视频在线 | 秋霞午夜av一区二区三区| 91豆麻精品91久久久久久| 国产精品日日摸夜夜摸av| 国产精品综合av一区二区国产馆| 日韩美女在线视频| 日本欧美大码aⅴ在线播放| 欧美在线播放高清精品| 亚洲精品免费播放| 91亚洲精品久久久蜜桃| 国产精品狼人久久影院观看方式| 国产成人精品一区二区三区四区| 精品88久久久久88久久久| 精品一区二区三区免费视频| 欧美成人欧美edvon| 极品尤物av久久免费看| 欧美videofree性高清杂交| 久久精品国产一区二区三区免费看| 欧美电影影音先锋| 日韩电影免费在线看| 91麻豆精品国产| 免费看日韩精品| 精品91自产拍在线观看一区| 国产露脸91国语对白| 国产网站一区二区| voyeur盗摄精品| 亚洲美女电影在线| 欧美性淫爽ww久久久久无| 亚洲成人av资源| 日韩一区二区三区视频在线 | 91黄色免费网站| 婷婷中文字幕综合| 精品女同一区二区| 国产成人一区二区精品非洲| 国产精品美女久久久久高潮| 91一区一区三区| 亚洲图片一区二区| 欧美一区二区私人影院日本| 久久国产剧场电影| 国产女人aaa级久久久级| 一本大道久久a久久精品综合| 一个色在线综合| 制服丝袜亚洲播放| 国产一区二区在线观看视频| 国产精品蜜臀av| 欧美日韩中文字幕一区二区| 美女mm1313爽爽久久久蜜臀| 国产亚洲成av人在线观看导航| 一本一道久久a久久精品| 亚洲国产精品欧美一二99| 日韩一级大片在线观看| 国产不卡在线视频| 亚洲一区二区欧美| 精品国产网站在线观看| 色综合久久中文综合久久牛| 石原莉奈在线亚洲二区| 久久精品视频免费| 91精彩视频在线观看| 久久99深爱久久99精品| 国产精品美女www爽爽爽| 欧美日韩高清在线播放| 国产精品一区二区在线看| 一区二区三区在线视频观看| 精品区一区二区| 91久久精品一区二区二区| 久久精品国产免费| 亚洲精品久久久蜜桃| 精品国内二区三区| 色哟哟一区二区三区| 久久精品二区亚洲w码| 亚洲欧美国产三级| 精品99一区二区| 欧美性色aⅴ视频一区日韩精品| 久久精品国产亚洲a| 亚洲一线二线三线久久久| 久久久久久久一区| 欧美日韩免费高清一区色橹橹 | 国产综合色在线视频区| 亚洲免费av高清| 国产欧美日韩激情|