I have a MS-Visual Studio 2005 workspace having all c code. This application(exe) allocates memory dynamically from heap using malloc and realloc. I want to calculate the maximu
Memory Validator can do this.
There are several different reports that you will find useful:
Running Totals. This is presented as a dialog box and provides current, cumulative and total values for each of the main memory allocator (C runtime, HeapAlloc, LocalAlloc, GlobalAlloc, CoTaskMemAlloc, etc).
Objects. This is one of the main tabs and displays object type, size, count, cumulative. Also subtabs for per-thread and per-dll values.
Sizes. This is one of the main tabs and displays size, count, cumulative. Also subtabs for per-thread and per-dll values.
Virtual. This displays a graphical view of memory (one pixel == one page of memory) and has subtabs showing detailed virtual memory data for virtual memory pages and virtual memory paragraphs.
Full disclosure: I am part of the Memory Validator team.
I would recommend the following:
malloc/realloc
calls with calls you your OWN function that would perform the analysis.malloc/realloc
.VS has a number of heap debugging tools such as _heapwalk
, which will let you walk through the heap and get information about blocks on the heap. Most of what you need to do is figure out when your heap is at maximum usage, so you know when to walk it and find its size.
If you statically link with the CRT, you can 'overrule' the implementation of malloc, realloc, free (in fact, all functions that appear in malloc.c, realloc,c free.c and/or dbgheap.c in the CRT). It is doable but may require some iterations before you get the full set of functions that need to be overruled.
If you dynamically link with the CRT, you can redefine malloc, realloc and free like this:
#define malloc(s) mymalloc(s)
#define realloc(p,s) myrealloc(p,s)
#define free(p) myfree(p)
The implementations of mymalloc, myrealloc and myfree can then simply use malloc, realloc and free (be sure not to use the #define in the source file that implements mymalloc, ...) or you could use the native Windows functions.