OVH Cloud OVH Cloud

Comment changer la limite de taille de stack ?

5 réponses
Avatar
olivier.marti
Bonjour,

J'ai compilè un petit programme Fortran qui me fait "Segmentation
fault". Il fait ça à l'appel d'une routine qui doit créer un gros
tableau dynamique. Je suppose que c'est la taille de la pile qui est en
cause :

lsce4013-marti-40-~/Olivier/Downloads/PHC:limit
cputime unlimited
filesize unlimited
datasize 6144 kbytes
stacksize 8192 kbytes
coredumpsize 0 kbytes
memoryuse unlimited
descriptors 256
memorylocked unlimited
maxproc 100

J'essaye donc d'augmenter la limite sur la pile :

lsce4013-marti-41-~/Olivier/Downloads/PHC:limit stacksize 81920
limit: stacksize: Can't set limit (Operation not permitted)

Qu'a cela ne tienne, je vais le faire avec su :

lsce4013-marti-32-~/Olivier/Downloads/PHC:sudo limit stacksize 10000
Password:
sudo: limit: command not found

J'ai supposé que c'est parce que le su s'éxécute dans le shell de root,
donc en batch. Et que limit est la commande tcsh, mon shell utilisateur
? Mais apparemment non :

lsce4013-marti-32-~/Olivier/Downloads/PHC:sudo limit stacksize 10000
Password:
sudo: limit: command not found

En revanche je peut passer en bash :

lsce4013-marti-40-~/Olivier/Downloads/PHC:bash
lsce4013:~/Olivier/Downloads/PHC marti$ ulimit -s 10000
lsce4013:~/Olivier/Downloads/PHC marti$ ulimit -s
10000
lsce4013:~/Olivier/Downloads/PHC marti$ exit
lsce4013-marti-41-~/Olivier/Downloads/PHC:

Mais ça a changer les limites dans un sous-shell bash, mais pas dans mon
tcsh ...

Bref, comment je peut changer la limite de taille de pile sous tcsh ???

Merci d'avance

Olivier

5 réponses

Avatar
Patrick Stadelmann
In article <1hktv61.ue9s5k2aqt1N%,
(Olivier Marti) wrote:

J'ai compilè un petit programme Fortran qui me fait "Segmentation
fault". Il fait ça à l'appel d'une routine qui doit créer un gros
tableau dynamique. Je suppose que c'est la taille de la pile qui est en
cause :


Un tableau dynamique n'est pas alloué dans la pile normalement...

Patrick
--
Patrick Stadelmann

Avatar
Saïd
Olivier Marti :
Bonjour,

J'ai compilè un petit programme Fortran qui me fait "Segmentation
fault". Il fait ça à l'appel d'une routine qui doit créer un gros
tableau dynamique. Je suppose que c'est la taille de la pile qui est en
cause :

lsce4013-marti-40-~/Olivier/Downloads/PHC:limit
cputime unlimited
filesize unlimited
datasize 6144 kbytes
stacksize 8192 kbytes
coredumpsize 0 kbytes
memoryuse unlimited
descriptors 256
memorylocked unlimited
maxproc 100

J'essaye donc d'augmenter la limite sur la pile :

lsce4013-marti-41-~/Olivier/Downloads/PHC:limit stacksize 81920
limit: stacksize: Can't set limit (Operation not permitted)

Qu'a cela ne tienne, je vais le faire avec su :

lsce4013-marti-32-~/Olivier/Downloads/PHC:sudo limit stacksize 10000
Password:
sudo: limit: command not found

J'ai supposé que c'est parce que le su s'éxécute dans le shell de root,
donc en batch. Et que limit est la commande tcsh, mon shell utilisateur
? Mais apparemment non :

lsce4013-marti-32-~/Olivier/Downloads/PHC:sudo limit stacksize 10000
Password:
sudo: limit: command not found

En revanche je peut passer en bash :

lsce4013-marti-40-~/Olivier/Downloads/PHC:bash
lsce4013:~/Olivier/Downloads/PHC marti$ ulimit -s 10000
lsce4013:~/Olivier/Downloads/PHC marti$ ulimit -s
10000
lsce4013:~/Olivier/Downloads/PHC marti$ exit
lsce4013-marti-41-~/Olivier/Downloads/PHC:

Mais ça a changer les limites dans un sous-shell bash, mais pas dans mon
tcsh ...

Bref, comment je peut changer la limite de taille de pile sous tcsh ???

Merci d'avance

Olivier


A part lancer un shell au nom de root, je ne vois pas.

Sinon, comment est-ce que tu alloues ta place memoire? Sous C (je ne
connais pas fortran):

int haha[3000000];

va allouer 3*10^6 entiers sur la pile -> seg fault dans ton cas.
Par contre l'allocation dynamique ne va pas poser de probleme:

int * haha;

haha= (int *) malloc(3000000*sizeof(int));
if (haha==NULL) exit(99); /* pas assez de memoire */

devrait resoudre le probleme en allouant la memoire sur le tas.

La pile sert surtout aux petites donnees et aux arguments des fonctions. Si
tu veux que ton programme fonctionne sur d'autres machines il vaut mieux
faire des allocations dynamiques des que tu veux beaucoup de place memoire.

Si tu utilises fortran 77 c'est mal barré. Mais fortran 90 a l'air de
supporter l'allocation dynamique.

--
Saïd.
"Bless this, O Lord, that with it thou mayst blow thine enemies to tiny
bits, in thy mercy."
In the Book of Armaments, Chapter 4. (The Holy Hand Grenade)

Avatar
Saïd
Patrick Stadelmann :
In article <1hktv61.ue9s5k2aqt1N%,
(Olivier Marti) wrote:

J'ai compilè un petit programme Fortran qui me fait "Segmentation
fault". Il fait ça à l'appel d'une routine qui doit créer un gros
tableau dynamique. Je suppose que c'est la taille de la pile qui est en
cause :


Un tableau dynamique n'est pas alloué dans la pile normalement...



Je n'avais meme pas vu qu'il disait "dynamique". olivier, as-tu verifie que
l'allocation s'est bien passee? Et que tu ne depasses pas les bornes lors de
l'acces a ce tableau?


--
Saïd.
"Bless this, O Lord, that with it thou mayst blow thine enemies to tiny
bits, in thy mercy."
In the Book of Armaments, Chapter 4. (The Holy Hand Grenade)


Avatar
olivier.marti
Saïd wrote:

Patrick Stadelmann :
In article <1hktv61.ue9s5k2aqt1N%,
(Olivier Marti) wrote:

J'ai compilè un petit programme Fortran qui me fait "Segmentation
fault". Il fait ça à l'appel d'une routine qui doit créer un gros
tableau dynamique. Je suppose que c'est la taille de la pile qui est en
cause :


Un tableau dynamique n'est pas alloué dans la pile normalement...



Je n'avais meme pas vu qu'il disait "dynamique". olivier, as-tu verifie que
l'allocation s'est bien passee? Et que tu ne depasses pas les bornes lors de
l'acces a ce tableau?


Ca n'est pas de l'allocation dynamique, mais de l'allocation
"automatique" : je déclare un tableau local dans une sub-routine, et la
runtime library (je crois ..) du Fortran 90 fait l'allocation à
l'netrée, la désallocation à la sortie. Pour moi ce genre de chose se
fait dans la pile, mais je n'en suis pas sûr. Je n'ai pas vraiment moyen
de contrôler si c'est bien la que ça plante.

Bon ce programme marche sur une machine Linux, même en limitant
sévèrement la taille de pile .... Le problème doit donc être ailleurs

Mais quand même par curiosité, j'aimerais bien savoir changer ces
limites ...

Olivier



Avatar
Saïd
Olivier Marti :
Saïd wrote:

Patrick Stadelmann :
In article <1hktv61.ue9s5k2aqt1N%,
(Olivier Marti) wrote:

J'ai compilè un petit programme Fortran qui me fait "Segmentation
fault". Il fait ça à l'appel d'une routine qui doit créer un gros
tableau dynamique. Je suppose que c'est la taille de la pile qui est en
cause :


Un tableau dynamique n'est pas alloué dans la pile normalement...



Je n'avais meme pas vu qu'il disait "dynamique". olivier, as-tu verifie que
l'allocation s'est bien passee? Et que tu ne depasses pas les bornes lors de
l'acces a ce tableau?


Ca n'est pas de l'allocation dynamique, mais de l'allocation
"automatique" : je déclare un tableau local dans une sub-routine, et la
runtime library (je crois ..) du Fortran 90 fait l'allocation à
l'netrée, la désallocation à la sortie. Pour moi ce genre de chose se
fait dans la pile, mais je n'en suis pas sûr. Je n'ai pas vraiment moyen
de contrôler si c'est bien la que ça plante.

Bon ce programme marche sur une machine Linux, même en limitant
sévèrement la taille de pile .... Le problème doit donc être ailleurs

Mais quand même par curiosité, j'aimerais bien savoir changer ces
limites ...

Olivier


Seul les programmes de root ont le droit d'augmenter les limites.
extrait du man de ulimit:
[EPERM] The limit specified to ulimit() would have raised the
maximum limit value, and the caller is not the super-
user.

Et meme ulimit (qui est un appel C a un appel systeme) n'a pas
d'implementation sous mac OS X pour augmenter la taille de la pile.

La seule solution est de lancer le programme depuis un shell root et (pour
des raisons de securite) faire que le programme change son userd_id apres le
lancement.

--
Saïd.
"Bless this, O Lord, that with it thou mayst blow thine enemies to tiny
bits, in thy mercy."
In the Book of Armaments, Chapter 4. (The Holy Hand Grenade)