This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
[ping][PATCH][BZ #15160] Fix FPE in memusagestat when mallocutilization is zero
- From: Siddhesh Poyarekar <siddhesh at redhat dot com>
- To: libc-alpha at sourceware dot org
- Date: Mon, 25 Feb 2013 17:54:14 +0530
- Subject: [ping][PATCH][BZ #15160] Fix FPE in memusagestat when mallocutilization is zero
- References: <20130219142636.GE30015@spoyarek.pnq.redhat.com>
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;
> }