VC2015開發的程式長時間拷機測驗,最終記憶體耗盡,大概10個小時左右跑死。程式中創建了一個執行緒,while回圈持續讀取圖片進行處理。
根據網上的帖子,對記憶體泄露情況進行監控,輸出相關資訊,修改了一些錯誤,有改善。但依然有泄露。
因此,while中改成不放其它代碼,只放記憶體泄露監控函式。發現,依然有泄露。
嘗試用AfxBeginThread、CreateThread兩個不同的函式創建兩個不同的執行緒,進行對比,均有泄露。
以下是根據網上的帖子,進行記憶體泄露監控的幾處關鍵操作:
1、在啟動執行緒的對話框的.h檔案中添加一下代碼:
//記憶體泄露檢查
#ifdef _DEBUG
#define _CRTDBG_MAP_ALLOC
#include<stdlib.h>
//#include <malloc.h>
#include<crtdbg.h>
#endif
2、在在啟動執行緒的對話框的OnInitDialog()函式中,添加以下代碼,監控記憶體泄露,并將結果輸出到檔案
#ifdef _DEBUG
CString str_filename = _T("memleak.log");
HANDLE hLogFile;//宣告日志檔案句柄
hLogFile = CreateFile(str_filename, GENERIC_WRITE, FILE_SHARE_WRITE | FILE_SHARE_READ,
NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);//創建日志檔案
_CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE);//將warn級別的內容都輸出到檔案(注意dump的報告級別即為warning)
_CrtSetReportFile(_CRT_WARN, hLogFile);//將日志檔案設定為告警的輸出檔案
_CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) | _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF | _CRTDBG_CHECK_ALWAYS_DF);
#endif
3、在對話框中一個按鈕下,創建并啟動執行緒
m_threadMassTest = AfxBeginThread((AFX_THREADPROC)Grab2MassCheck, pDlgThis, THREAD_PRIORITY_HIGHEST);
4、執行緒函式
UINT Grab2MassCheck(LPVOID pParam)
{
while (TRUE)
{
SniffMemLeak(oldstate, newstate, diffstate);
}
return 0;
}
5、自定義的記憶體泄露監控函式
CMemoryState oldstate, newstate, diffstate;
void SniffMemLeak(CMemoryState &oldstate, CMemoryState &newstate, CMemoryState &diffstate)
{
newstate.Checkpoint();
if (diffstate.Difference(oldstate, newstate))
{
oldstate.DumpAllObjectsSince();
newstate.DumpAllObjectsSince();
//dump相鄰時間點間的記憶體塊變化
diffstate.DumpStatistics();
}
oldstate.Checkpoint();
SYSTEMTIME *pnow_local_time = nullptr;
pnow_local_time = new SYSTEMTIME;
GetLocalTime(pnow_local_time);
_RPT4(_CRT_WARN, "%02d %02d:%02d:%02d:%04d snapshot dump.\n\n",
pnow_local_time->wDay, pnow_local_time->wHour, pnow_local_time->wMinute, pnow_local_time->wSecond, pnow_local_time->wMilliseconds);
free(pnow_local_time);
pnow_local_time = nullptr;
}
6、啟動執行緒,復制記錄記憶體泄露情況的文本副本,打開,可以開到內心泄露的情況。類似如下:
........
172} normal block at 0x0000025242F94630, 40 bytes long.
Data: < > 04 00 00 00 00 00 00 00 D0 02 E8 14 FF 7F 00 00
{171} normal block at 0x0000025242F93460, 56 bytes long.
Data: < 6 > E8 36 D4 14 FF 7F 00 00 04 00 00 00 CD CD CD CD
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\oleinit.cpp(84) : {167} client block at 0x0000025242F6C740, subtype c0, 104 bytes long.
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\dumpcont.cpp(23) : atlTraceGeneral - a CCmdTarget object at $0000025242F6C740, 104 bytes long
{83} client block at 0x0000025242F8B090, subtype c0, 128 bytes long.
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\dumpcont.cpp(23) : atlTraceGeneral - a CDynLinkLibrary object at $0000025242F8B090, 128 bytes long
Object dump complete.
Dumping objects ->
Object dump complete.
0 bytes in 0 Free Blocks.
1372 bytes in 15 Normal Blocks.
31302 bytes in 143 CRT Blocks.
0 bytes in 0 Ignore Blocks.
2120 bytes in 8 Client Blocks.
Largest number used: 36644 bytes.
Total allocations: 314758 bytes.
12 10:50:29:0743 snapshot dump.
12 10:50:29:0743 snapshot dump.
不知道這個問題該如何解決,望高手指點。非常感謝!
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/247817.html
標籤:進程/線程/DLL
