Performance Meter and Memory Leaks Detector | CodeGuru

Performance Meter and Memory Leaks Detector

Environment: [eg VC6 SP4, NT4 SP3, winCE 2.0]–> This article describes how to monitor program heap for memory leaks even if you load DLL’s or use a CRT-functions for memory allocating. The code provided with this article works on Windows NT. It should work on Windows2K system as well, although it has not been tested […]

Written By
CodeGuru Staff
CodeGuru Staff
Dec 5, 2001
2 minute read
CodeGuru content and product recommendations are editorially independent. We may make money when you click on links to our partners. Learn More

Environment: [eg VC6 SP4, NT4 SP3, winCE 2.0]–>

This article describes how to monitor program heap for memory leaks even if you load DLL’s or use a CRT-functions for memory allocating. The code provided with this article works on Windows NT. It should work on Windows2K system as well, although it has not been tested on it. It has been written with MS Visual C/C++ 6.0

Usage

While working in QA team I got a task “Measure product-components performance, i.e. CPU/Memory usage during their work and detect possible memory leaks”. Detecting of memory leaks isn’t so simple procedure. At first because there is no any definite technique for making it. The first idea was viewing the process memory space at the page level. But this method is rough enough (I guess), apart Windows doesn’t always free allocated blocks immediately. So I decided to calculate PROCESS_HEAP_ENTRY_BUSY nodes in program heap before using all components (loading dll’s) and after it.

About CPU usage – the first idea wasn’t so bright again 🙂 I’ve tried to measure CPU usage by Windows NT Pdh-functions, but necessity of loading “pdh.lib” call in question clearness of experiment. So I used NtQuerySystemInformation technique (unfortunately I don’t know the author’s name, because I get sources through third person).

Well now, to detect memory leaks in the components of your application and to get system resources info during work, you can define a monitoring thread function like this:

#define PERFORMANCE_FILENAME "DocProcPerf.log"

typedef struct EVENTS
{
  HANDLE StartEvent;
  HANDLE StopEvent;
};

DWORD WINAPI UserThreadProc(LPVOID lpParameter)
{
  EVENTS* hWait = (EVENTS *)lpParameter;
  DWORD  dwStartTime = GetTickCount();

  CCompInfo* hInfo = new CCompInfo(PERFORMANCE_FILENAME);

  hInfo->HeapMakeSnapShot();
  hInfo->HeapStoreDumpToFile();

  SetEvent((HANDLE)hWait->StartEvent);

  hInfo->m_log->print( "DocProcTest started at %sn",
                       hInfo->GetTimeString() );

  while (1)
  {
    if(WaitForSingleObject((HANDLE)hWait->StopEvent,0) == WAIT_OBJECT_0)
      break;
    hInfo->m_log->print( "%s CPU[%d%%] Memory[%dKb]n",
                         hInfo->GetTimeString(),
                         hInfo->GetCPUInfo(),
                         hInfo->HeapCommitedBytes()/1024);
    Sleep(1000);
  };

  hInfo->m_log->print( "%s CPU[%d%%] Memory[%dKb]n",
                       hInfo->GetTimeString(),
                       hInfo->GetCPUInfo(),
                       hInfo->HeapCommitedBytes()/1024);

  hInfo->m_log->print( "DocProcTest finished at %sn",
                       hInfo->GetTimeString() );
  hInfo->m_log->print( "Elapsed time %d secn",
                       (GetTickCount() - dwStartTime)/1000 );
  hInfo->m_log->print( "Total memory difference: %dKbnn",
                       hInfo->HeapCompareSnapShots()/1024 );

  CloseHandle((HANDLE)hWait->StopEvent);
  CloseHandle((HANDLE)hWait->StartEvent);

  if (NULL != hWait)
    delete hWait;

  hInfo->HeapCompareDumpWithFile(FALSE); // basic report
  hInfo->HeapCompareDumpWithFile(TRUE);  // extended report

  if (NULL != hInfo)
    delete hInfo;

  return 0;
}

Thus we just have to add our keep-an-eye-thread initialization lines in the “main” application function like this:

printf(  "nTest started.n");
  EVENTS *hEvent = new EVENTS;
  hEvent->StartEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
  hEvent->StopEvent = CreateEvent(NULL,TRUE,FALSE,NULL);

  HANDLE hTread = CreateThread( NULL,
                                NULL,
                                UserThreadProc,
                                hEvent,
                                NULL,
                                NULL);
  WaitForSingleObject((HANDLE)hEvent->StartEvent,15000);
  ...
  program body goes here
  ...
  if (NULL != hEvent)
    SetEvent((HANDLE)hEvent->StopEvent);
  while (WaitForSingleObject(hTread,1000) != WAIT_OBJECT_0)
    Sleep(1000);
  printf(  "nTest finished.n");

In conclusion I want to add that this method is under research now so feel free to ask me for new stuff or modifications of it. I’ll be grateful for your comments and suggestions.

Downloads

Download source – 7 Kb

CodeGuru Logo

CodeGuru covers topics related to Microsoft-related software development, mobile development, database management, and web application programming. In addition to tutorials and how-tos that teach programmers how to code in Microsoft-related languages and frameworks like C# and .Net, we also publish articles on software development tools, the latest in developer news, and advice for project managers. Cloud services such as Microsoft Azure and database options including SQL Server and MSSQL are also frequently covered.

Property of TechnologyAdvice. © 2026 TechnologyAdvice. All Rights Reserved

Advertiser Disclosure: Some of the products that appear on this site are from companies from which TechnologyAdvice receives compensation. This compensation may impact how and where products appear on this site including, for example, the order in which they appear. TechnologyAdvice does not include all companies or all types of products available in the marketplace.