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-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
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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
In article <1hktv61.ue9s5k2aqt1N%olivier.marti@ensta.org>,
olivier.marti@ensta.org (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 <Patrick.Stadelmann@unine.ch>
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
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-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
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)
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-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
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)
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-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
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)
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)
Patrick Stadelmann :
In article <1hktv61.ue9s5k2aqt1N%olivier.marti@ensta.org>,
olivier.marti@ensta.org (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)
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)
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
Saïd <said@brian.lan> wrote:
Patrick Stadelmann :
In article <1hktv61.ue9s5k2aqt1N%olivier.marti@ensta.org>,
olivier.marti@ensta.org (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 ...
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
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)
Olivier Marti :
Saïd <said@brian.lan> wrote:
Patrick Stadelmann :
In article <1hktv61.ue9s5k2aqt1N%olivier.marti@ensta.org>,
olivier.marti@ensta.org (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)
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)