delorie.com/archives/browse.cgi   search  
Mail Archives: cygwin/2004/08/12/07:34:19

Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm
List-Subscribe: <mailto:cygwin-subscribe AT cygwin DOT com>
List-Archive: <http://sourceware.org/ml/cygwin/>
List-Post: <mailto:cygwin AT cygwin DOT com>
List-Help: <mailto:cygwin-help AT cygwin DOT com>, <http://sourceware.org/ml/#faqs>
Sender: cygwin-owner AT cygwin DOT com
Mail-Followup-To: cygwin AT cygwin DOT com
Delivered-To: mailing list cygwin AT cygwin DOT com
From: "Dave Korn" <dk AT artimi DOT com>
To: <cygwin AT cygwin DOT com>
Subject: RE: simple C program crashes at run time
Date: Thu, 12 Aug 2004 12:31:38 +0100
MIME-Version: 1.0
In-Reply-To: <200408121041.MAA00181@gsnet0.lngs.infn.it>
Message-ID: <NUTMEGcljD2E2044cY600000d08@NUTMEG.CAM.ARTIMI.COM>
X-OriginalArrivalTime: 12 Aug 2004 11:31:39.0484 (UTC) FILETIME=[EF18B9C0:01C4805F]

> -----Original Message-----
> From: cygwin-owner On Behalf Of user
> Sent: 12 August 2004 11:48

> #define  TAGLIA  415
> main()
> {
> 
>    int i, j, k, iran;
>    unsigned int seed;
>    float  unran;
>    float  mata[TAGLIA][TAGLIA],
>           matb[TAGLIA][TAGLIA],
>           matc[TAGLIA][TAGLIA];

  1 float == 4 bytes.

  415 * 415 == 172225 elements

  3 arrays * 415^2 elements each * 4 bytes == 2066700 bytes

  I believe that's a bit large for the stack.

> It works for  TAGLIA < 416
> With TAGLIA = 416 it looks unusually fast and without outputs
> with TAGLIA > 416 it crashes:
>  
> sysnaz AT wngsnt ~
> $ ./unlucky.exe
> Segmentation fault (core dumped)
> 
> $ more unlucky.exe.stackdump
> Exception: STATUS_STACK_OVERFLOW at eip=00401593

  And indeed, the system agrees with me.

> What does it happen? the same code built on linux doesn't 
> crashes..

  Linux and 'doze reserve different amounts of memory space for the stack
when a task starts up (to be precise, when a thread starts up within a
task).  In particular, the default stack size for a newly-created thread
under windoze is 1Mb, which is less than half what you'd need for those
arrays.

  See 
http://www.google.com/search?hl=en&ie=UTF-8&q=increase+default+thread+stack+
size+site%3Acygwin.com 
for masses more information.  In particular, you may need to recompile your
application with the "-Wl,--stack,<some big number>" argument.

  Here's an example.   I took your code and removed the #define TAGLIA, so I
could pass it in as a commandline -D flag:

dk AT mace /davek/test/cygstack> cat telle.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

main()
{

   int i, j, k, iran;
   unsigned int seed;
   float  unran;
   float  mata[TAGLIA][TAGLIA],
          matb[TAGLIA][TAGLIA],
          matc[TAGLIA][TAGLIA];

   srand(seed);
   printf("init start...\n");

/* this should init all elements with pseudo-random float values */
   for(i=0;i<TAGLIA;i++)
   {
     for(j=0;j<TAGLIA;j++)
     {
       iran=rand(); unran = iran / 1.0E10;
       mata[i][j]=unran;
       iran=rand(); unran = iran / 1.0E10;
       matb[i][j]=unran; matc[i][j] = 0.0;
     }
   }
   printf("init end.....\n");

/* do something to grab cpu-time */
   for(i=0;i<TAGLIA;i++)
   {
     for(j=0;j<TAGLIA;j++)
     {
       for (k=0;k<TAGLIA;k++)
          matc[i][j]=matc[i][j]+mata[i][k]*matb[k][j];
     }
   }

   printf("all done.....\n");
}

dk AT mace /davek/test/cygstack> gcc -o unlucky -DTAGLIA=410 telle.c
dk AT mace /davek/test/cygstack> ./unlucky.exe
init start...
init end.....
all done.....
dk AT mace /davek/test/cygstack> gcc -o unlucky -DTAGLIA=411 telle.c
dk AT mace /davek/test/cygstack> ./unlucky.exe
Segmentation fault (core dumped)
dk AT mace /davek/test/cygstack> gcc -o unlucky -DTAGLIA=411 telle.c
-Wl,--stack,8
192000
dk AT mace /davek/test/cygstack> ./unlucky.exe
init start...
init end.....
all done.....
dk AT mace /davek/test/cygstack> gcc -o unlucky -DTAGLIA=444 telle.c
-Wl,--stack,8
192000
dk AT mace /davek/test/cygstack> ./unlucky.exe
init start...
init end.....
all done.....
dk AT mace /davek/test/cygstack> gcc -o unlucky -DTAGLIA=444 telle.c
dk AT mace /davek/test/cygstack> ./unlucky.exe
Segmentation fault (core dumped)
dk AT mace /davek/test/cygstack>



  As you can see, for reasons probably relating to different environment
variable size, I can only get up to 410 before I get errors; adding the
--stack option fixes it.



    cheers, 
      DaveK
-- 
Can't think of a witty .sigline today....


--
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
Problem reports:       http://cygwin.com/problems.html
Documentation:         http://cygwin.com/docs.html
FAQ:                   http://cygwin.com/faq/

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019