This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[ping][PATCH][BZ #15160] Fix FPE in memusagestat when mallocutilization is zero


Ping!

On Tue, Feb 19, 2013 at 07:56:36PM +0530, Siddhesh Poyarekar wrote:
> Hi,
> 
> As described in bug #15160, memusagestat can crash with a FPE when the
> program it profiles does not use any dynamically allocated memory.
> The reproducer in the bz demonstrates this.
> 
> Attached patch fixes this crash by ensuring that nothing is plotted in
> the output graph if the peak utilization for either the heap or stack
> is 0, thus preventing this crash and also showing the correct plot.
> Not regressions reported due to this change.  OK to commit?
> 
> Siddhesh
> 
> 	* malloc/memusagestat.c (main): Draw graphs for heap and stack
> 	only if MAXSIZE_HEAP and MAXSIZE_STACK are non-zero.
> 
> 
> diff --git a/malloc/memusagestat.c b/malloc/memusagestat.c
> index f561e0d..7bbd009 100644
> --- a/malloc/memusagestat.c
> +++ b/malloc/memusagestat.c
> @@ -319,17 +319,26 @@ main (int argc, char *argv[])
>  
>    for (line = 1; line <= 3; ++line)
>      {
> -      cnt = ((ysize - 40) * (maxsize_heap / 4 * line / heap_scale)) /
> -	(maxsize_heap / heap_scale);
> -      gdImageDashedLine (im_out, 40, ysize - 20 - cnt, xsize - 40,
> -			 ysize - 20 - cnt, red);
> -      snprintf (buf, sizeof (buf), heap_format, maxsize_heap / 4 * line /
> -		heap_scale);
> -      gdImageString (im_out, gdFontSmall, 39 - strlen (buf) * 6,
> -		     ysize - 26 - cnt, (unsigned char *) buf, red);
> -
> -      cnt2 = ((ysize - 40) * (maxsize_stack / 4 * line / stack_scale)) /
> -	(maxsize_stack / stack_scale);
> +      if (maxsize_heap > 0)
> +	{
> +	  cnt = (((ysize - 40) * (maxsize_heap / 4 * line / heap_scale))
> +		 / (maxsize_heap / heap_scale));
> +	  gdImageDashedLine (im_out, 40, ysize - 20 - cnt, xsize - 40,
> +			     ysize - 20 - cnt, red);
> +	  snprintf (buf, sizeof (buf), heap_format,
> +		    maxsize_heap / 4 * line / heap_scale);
> +	  gdImageString (im_out, gdFontSmall, 39 - strlen (buf) * 6,
> +			 ysize - 26 - cnt, (unsigned char *) buf, red);
> +	}
> +      else
> +	cnt = 0;
> +
> +      if (maxsize_stack > 0)
> +	cnt2 = (((ysize - 40) * (maxsize_stack / 4 * line / stack_scale))
> +		/ (maxsize_stack / stack_scale));
> +      else
> +	cnt2 = 0;
> +
>        if (cnt != cnt2)
>  	gdImageDashedLine (im_out, 40, ysize - 20 - cnt2, xsize - 40,
>  			   ysize - 20 - cnt2, green);
> @@ -372,7 +381,7 @@ main (int argc, char *argv[])
>  				    ysize - 14, yellow);
>  	  previously = now;
>  
> -	  if (also_total)
> +	  if (also_total && maxsize_heap > 0)
>  	    {
>  	      size_t new3;
>  
> @@ -386,21 +395,27 @@ main (int argc, char *argv[])
>  	      last_total = new3;
>  	    }
>  
> -	  // assert (entry.heap <= maxsize_heap);
> -	  new[0] = (ysize - 20) - ((((unsigned long long int) (ysize - 40))
> -				    * entry.heap) / maxsize_heap);
> -	  gdImageLine (im_out, 40 + ((xsize - 80) * (cnt - 1)) / total,
> -		       last_heap, 40 + ((xsize - 80) * cnt) / total, new[0],
> -		       red);
> -	  last_heap = new[0];
> -
> -	  // assert (entry.stack <= maxsize_stack);
> -	  new[1] = (ysize - 20) - ((((unsigned long long int) (ysize - 40))
> -				    * entry.stack) / maxsize_stack);
> -	  gdImageLine (im_out, 40 + ((xsize - 80) * (cnt - 1)) / total,
> -		       last_stack, 40 + ((xsize - 80) * cnt) / total, new[1],
> -		       green);
> -	  last_stack = new[1];
> +	  if (maxsize_heap > 0)
> +	    {
> +	      new[0] = ((ysize - 20)
> +			- ((((unsigned long long int) (ysize - 40))
> +			    * entry.heap) / maxsize_heap));
> +	      gdImageLine (im_out, 40 + ((xsize - 80) * (cnt - 1)) / total,
> +			   last_heap, 40 + ((xsize - 80) * cnt) / total,
> +			   new[0], red);
> +	      last_heap = new[0];
> +	    }
> +
> +	  if (maxsize_stack > 0)
> +	    {
> +	      new[1] = ((ysize - 20)
> +			- ((((unsigned long long int) (ysize - 40))
> +			    * entry.stack) / maxsize_stack));
> +	      gdImageLine (im_out, 40 + ((xsize - 80) * (cnt - 1)) / total,
> +			   last_stack, 40 + ((xsize - 80) * cnt) / total,
> +			   new[1], green);
> +	      last_stack = new[1];
> +	    }
>  	}
>  
>        cnt = 0;
> @@ -448,7 +463,7 @@ main (int argc, char *argv[])
>  	      next_tick += MAX (1, total / 20);
>  	    }
>  
> -	  if (also_total)
> +	  if (also_total && maxsize_heap > 0)
>  	    {
>  	      size_t new3;
>  
> @@ -459,16 +474,24 @@ main (int argc, char *argv[])
>  	      last_total = new3;
>  	    }
>  
> -	  new[0] = (ysize - 20) - ((((unsigned long long int) (ysize - 40))
> -				    * entry.heap) / maxsize_heap);
> -	  gdImageLine (im_out, last_xpos, last_heap, xpos, new[0], red);
> -	  last_heap = new[0];
> +	  if (maxsize_heap > 0)
> +	    {
> +	      new[0] = ((ysize - 20)
> +			- ((((unsigned long long int) (ysize - 40))
> +			    * entry.heap) / maxsize_heap));
> +	      gdImageLine (im_out, last_xpos, last_heap, xpos, new[0], red);
> +	      last_heap = new[0];
> +	    }
>  
> -	  // assert (entry.stack <= maxsize_stack);
> -	  new[1] = (ysize - 20) - ((((unsigned long long int) (ysize - 40))
> -				    * entry.stack) / maxsize_stack);
> -	  gdImageLine (im_out, last_xpos, last_stack, xpos, new[1], green);
> -	  last_stack = new[1];
> +	  if (maxsize_stack > 0)
> +	    {
> +	      new[1] = ((ysize - 20)
> +			- ((((unsigned long long int) (ysize - 40))
> +			    * entry.stack) / maxsize_stack));
> +	      gdImageLine (im_out, last_xpos, last_stack, xpos, new[1],
> +			   green);
> +	      last_stack = new[1];
> +	    }
>  
>  	  last_xpos = xpos;
>  	}


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]