Hi guys

I have some C/C++ programs that use very odd memory usage. I have made a 
small replica below
(it can also be taken from http://pastebin.com/1ammgpCE)
Save e.g. as memfun.c

In the C-code I generate 20 peaks of very short memory peaks, and you 
can compile (on Linux) and run as this:
    gcc -o memfun memfun.c  -lm
    valgrind --tool=massif --massif-out-file=massif.out ./memfun
    massif-visualizer massif.out
or
    ms_print massif.out > massif.txt; less massif.txt)

(BTW; Thanx to the maintainers of massif-visualizer - this rocks)


However with the standard settings I only get 3 memory peaks detected - 
not 20.
Obviously I can tweak --threshold= and --peak-inaccuracy= but it seems 
that
I in general can be sure that I can catch all peaks. Please comment :-)

Are these something that I miss here? Are there other tools that are 
better suited for
detecting memory peaks like this memory-hedgehog....

Thanx mates

Best

Peter

----------------
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

/*
Demo program:
  gcc -o memfun memfun.c  -lm
  valgrind --tool=massif --massif-out-file=massif.out ./memfun
  massif-visualizer massif.out
  (or ms_print massif.out > massif.txt; less massif.txt)
*/


int main(void)
{
   int ii,jj;
   int *pt;
   int *pt2;
   float ac;
   int numberOfPeaks = 0;

   for (ii=0;ii<100;ii++) {
     /* Allocate some small linearly increasing memory block */
     pt = (int *)malloc((1000*ii+1)*sizeof(int));
     if (ii%5 == 0) {
       /* Allocate some gigantic memory block - but only every 10th 
iteration */
       pt2 = (int *)malloc((1000000)*sizeof(int));
       printf("Allocating large memory block\n");
       numberOfPeaks++;
     } else {
       /* Allocate just one element for every 9/10 iteration */
       pt2 = (int *)malloc((1)*sizeof(int));
     }
     /* Put in data and print it */
     pt2[0] = ii;
     printf("   Found value %i\n",pt2[0]);
     /* Free the memory - note that the peak */
     free(pt2);

     /* Spend time on "something" - the actual work does not matter*/
     ac = 1;
     for (jj=0;jj<10000*(1 + ii);jj++) {
       ac += sin(jj*0.01) + cos(jj*0.01 + 0.3);
     }
     printf("   Found dummy value %f\n",ac);
     /* Free the memory */
     free(pt);
   }
   printf("I made %i memory peaks\n",numberOfPeaks);
   return 0;
}


-- 
Peter Toft <p...@linuxbog.dk>

------------------------------------------------------------------------------
_______________________________________________
Valgrind-users mailing list
Valgrind-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/valgrind-users

Reply via email to