Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 29 Oct 1995 12:57:47 +0100 (MET)
From:      Andreas Klemm <andreas@knobel.gun.de>
To:        hackers@freebsd.org, current@freebsd.org, jkh@freebsd.org
Subject:   time -l, floating point exeption, division through '0'. trace + FIX !
Message-ID:  <199510291157.MAA00781@knobel.gun.de>

next in thread | raw e-mail | index | archive | help
Hi !

The problem is, that calling '/usr/bin/time -l' often results in a 
floating point exception, caused by a division through zero (long ticks) !

This works seems to be, that the value computed for ticks is ok here (>=1).

knobel# /usr/bin/time -l du
1       ./.tin/.news
1       ./.tin/.save
14      ./.tin
1       ./Mail
1       ./News
1       ./.elm
62      .
        0.06 real         0.00 user         0.02 sys
       508  maximum resident set size
        12  average shared memory size
        20  average unshared data size
       192  average unshared stack size
        96  page reclaims
         0  page faults
         0  swaps
         6  block input operations
         0  block output operations
         0  messages sent
         0  messages received
         0  signals received
         6  voluntary context switches
         5  involuntary context switches

But look at the following:

knobel# /usr/bin/time -l /bin/ls
.cshrc          .history        .newsrc         Mail
.elm            .klogin         .profile        News
.gopherrc       .login          .tin            xxx
.gopherrc~      .ncrecent       .xboing-scores  xxx.c
        0.01 real         0.00 user         0.00 sys
       216  maximum resident set size
Floating exception (core dumped)

Here what happens:

Program terminated with signal 8, Floating point exception.
#0  0x1af0 in main (argc=1, argv=0xefbfd9f8)
    at /local/FreeBSD/src-stable/usr.bin/time/time.c:112
112                     fprintf(stderr, "%10ld  %s\n",
(gdb) list
107
108                     ticks = hz * (ru.ru_utime.tv_sec + ru.ru_stime.tv_sec) +
109                          hz * (ru.ru_utime.tv_usec + ru.ru_stime.tv_usec) / 1000000;
110                     fprintf(stderr, "%10ld  %s\n",
111                             ru.ru_maxrss, "maximum resident set size");
112                     fprintf(stderr, "%10ld  %s\n",
113                             ru.ru_ixrss / ticks, "average shared memory size");
114                     fprintf(stderr, "%10ld  %s\n",
115                             ru.ru_idrss / ticks, "average unshared data size");
116                     fprintf(stderr, "%10ld  %s\n",

(gdb) r -l /bin/ls
Starting program: /usr/bin/time -l /bin/ls
.cshrc          .history        .newsrc         Mail            xxx.c
.elm            .klogin         .profile        News
.gopherrc       .login          .tin            time.core
.gopherrc~      .ncrecent       .xboing-scores  xxx
        0.02 real         0.00 user         0.00 sys
         0  maximum resident set size

Program received signal SIGFPE, Arithmetic exception.
0x1af0 in main (argc=1, argv=0xefbfd9f8)
    at /local/FreeBSD/src-stable/usr.bin/time/time.c:112
112                     fprintf(stderr, "%10ld  %s\n",

(gdb) display ru.ru_ixrss, ticks
1: ru.ru_ixrss, ticks = 0
(gdb) display ru.ru_ixrss
2: ru.ru_ixrss = 0
(gdb) display ticks
3: ticks = 0

When ticks is equal to zero, then the program dumps core....

ticks (long) will be computed as follows:

	ticks = hz * (ru.ru_utime.tv_sec + ru.ru_stime.tv_sec) +
		hz * (ru.ru_utime.tv_usec + ru.ru_stime.tv_usec) / 1000000;

	ticks = 100 * ( 0 + 0 ) +
		100 * ( 0 + 7415 ) / 1000000;

In this case ticks would be 0.74, but because of long ticks -> 0.

A simple hack would be, to force ticks to be at least '1'.  This could be 
done by simply adding '1'....

What do you think ?????

*** time.c.orig Fri May 27 14:32:52 1994
--- time.c      Sun Oct 29 12:50:26 1995
***************
*** 105,112 ****
                int hz = 100;                   /* XXX */
                long ticks;
  
!               ticks = hz * (ru.ru_utime.tv_sec + ru.ru_stime.tv_sec) +
!                    hz * (ru.ru_utime.tv_usec + ru.ru_stime.tv_usec) / 1000000;
                fprintf(stderr, "%10ld  %s\n",
                        ru.ru_maxrss, "maximum resident set size");
                fprintf(stderr, "%10ld  %s\n",
--- 105,113 ----
                int hz = 100;                   /* XXX */
                long ticks;
  
!               ticks = hz * (ru.ru_utime.tv_sec + ru.ru_stime.tv_sec)
!                       + hz * (ru.ru_utime.tv_usec + ru.ru_stime.tv_usec)
!                       / 1000000 + 1;  /* XXX avoid division through zero */
                fprintf(stderr, "%10ld  %s\n",
                        ru.ru_maxrss, "maximum resident set size");
                fprintf(stderr, "%10ld  %s\n",



-- 
$$ apsfilter - magic print filter 4lpd      @home : andreas@knobel.gun.de
$$ ftp://sunsite.unc.edu                    @work : andreas@sunny.wup.de
$$ /pub/Linux/system/Printing/aps-491.tgz   knobel: >>> powered by FreeBSD <<<



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199510291157.MAA00781>