Solved

Heap Usage for VC++ 5.0 ATL exe

Posted on 1998-12-18
2
412 Views
Last Modified: 2013-12-14
I have abnormal heap growth from my ATL exe program running on NT4.0 Sp3/VC++5.0/ATL 2.1/VS SP3
after 24 hours of execution the memory usage from PView is:
Working Set 2,632 kb
Heap Usage  23,588kb

When I attach with the vc++ debugger and have the program stop gracefully I don't get any memory leak messages. (Bounds checker found nothing as well)

Is there a way to see what the Heap Usage is for each thread and each dll the process is using?

How can the Heap Usage be greater than the Working Set?

(I can't use heapwalker because the executable is loadded by a com call and heapwalker can't attach to a process that is running)
0
Comment
Question by:clarkA
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 2
2 Comments
 
LVL 86

Accepted Solution

by:
jkr earned 100 total points
ID: 1180536
>>How can the Heap Usage be greater than the Working Set?

Well, this is very normal, as the working set only is the representation of the _physical_ memory assigned to the process, everything that does not fit in is swapped out.


>>Is there a way to see what the Heap Usage is for each thread
>>and each dll the process is using?

No. The heap is assigned to the whole process, and all threads and modules use the same allocators to access the heap. But you can keep track where the memory is allocated by setting an allocation hook, e.g.

    _CrtSetDbgFlag  (       _CRTDBG_LEAK_CHECK_DF
                        |   _CRTDBG_DELAY_FREE_MEM_DF
                        |   _CrtSetDbgFlag  (   _CRTDBG_REPORT_FLAG)
                    );

    g_pPrevMemHook  =   _CrtSetAllocHook    (   ( _CRT_ALLOC_HOOK) DbgAllocHook);


static char *g_apszMemOperation[]   =   { "", "allocating", "re-allocating", "freeing" };
static char *g_apszMemBlockType[]   =   { "Free", "Normal", "CRT", "Ignore", "Client" };

int __cdecl     DbgAllocHook    (   int                 nAllocType,
                                    void                *pvData,
                                    size_t              nSize,
                                    int                 nBlockUse,
                                    long                lRequest,
                                    const unsigned char *pszFileName,
                                    int                 nLine
                                )
{
   char *pszFile    =   pszFileName ?   ( char *) pszFileName : "<unknown>";

   if   (   _CRT_BLOCK  ==  nBlockUse)   // Ignore internal C runtime library allocations
            return( TRUE);

   _ASSERT( ( nAllocType > 0 ) && ( nAllocType < 4 ) );
   _ASSERT( ( nBlockUse >= 0 ) && ( nBlockUse < 5 ) );

        DbgTrace    (   "Memory operation in %s, line %d: %s a %d-byte '%s' block (# %ld)",
                        pszFile,
                        nLine,
                        g_apszMemOperation  [   nAllocType],
                        nSize,
                        g_apszMemBlockType  [   nBlockUse],
                        lRequest
                    );

   if   (   pvData)
            DbgTrace    (   "at 0x%x\n",    pvData);
    else    DbgTrace    (   "\n");

   return( TRUE);         // Allow the memory operation to proceed
}

void    __cdecl DbgTrace    (   char    *pszFormat, ...)
{
    va_list args;

    va_start(   args,   pszFormat);

    char    acModule    [ MAX_PATH];
    DWORD   dwRC;

    EnterCriticalSection    (   &g_csDbg);

    dwRC    =   wvsprintf   (   g_acDbgBuf,
                                pszFormat,  
                                args
                            );          
    _ASSERTE    (   DBG_BUFSIZE  >=  dwRC);  

    dwRC    =   GetModuleFileName   (   NULL,  
                                        acModule,
                                        MAX_PATH
                                    );
               
    _ASSERTE    (   MAX_PATH    >=  dwRC);  

    _CrtDbgReport   (   _CRT_WARN,  
                        NULL,  
                        NULL,  
                        acModule,  
                        g_acDbgBuf  
                    );  

    LeaveCriticalSection    (   &g_csDbg);

    va_end  (   args);
}




0
 
LVL 86

Expert Comment

by:jkr
ID: 1180537
Ooops, and you could of course dive into the PSAPI functions...
0

Featured Post

PeopleSoft Has Never Been Easier

PeopleSoft Adoption Made Smooth & Simple!

On-The-Job Training Is made Intuitive & Easy With WalkMe's On-Screen Guidance Tool.  Claim Your Free WalkMe Account Now

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

With most software applications trying to cater to multiple user needs nowadays, the focus is to make them as configurable as possible. For e.g., when creating Silverlight applications which will connect to WCF services, the service end point usuall…
Whether you've completed a degree in computer sciences or you're a self-taught programmer, writing your first lines of code in the real world is always a challenge. Here are some of the most common pitfalls for new programmers.
The viewer will learn how to use and create new code templates in NetBeans IDE 8.0 for Windows.
The viewer will be introduced to the member functions push_back and pop_back of the vector class. The video will teach the difference between the two as well as how to use each one along with its functionality.

729 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question