Solved

Heap Usage for VC++ 5.0 ATL exe

Posted on 1998-12-18
2
407 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
  • 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

Courses: Start Training Online With Pros, Today

Brush up on the basics or master the advanced techniques required to earn essential industry certifications, with Courses. Enroll in a course and start learning today. Training topics range from Android App Dev to the Xen Virtualization Platform.

Question has a verified solution.

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

Suggested Solutions

Templates For Beginners Or How To Encourage The Compiler To Work For You Introduction This tutorial is targeted at the reader who is, perhaps, familiar with the basics of C++ but would prefer a little slower introduction to the more ad…
Here is a helpful source code for C++ Builder programmers that allows you to manage and manipulate HTML content from C++ code, while also handling HTML events like onclick, onmouseover, ... Some objects defined and used in this source include: …
THe viewer will learn how to use NetBeans IDE 8.0 for Windows to perform CRUD operations on a MySql database.
The viewer will be introduced to the technique of using vectors in C++. The video will cover how to define a vector, store values in the vector and retrieve data from the values stored in the vector.

785 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