Modifier la taille de la pile pour une application C++ sous Linux lors de la compilation avec le compilateur GNU
Dans OSX cours de C++ du programme de compilation avec g++
- je utiliser
LD_FLAGS= -Wl,-stack_size,0x100000000
mais dans SUSE Linux, je ne cesse de recevoir des erreurs comme:
x86_64-suse-linux/bin/ld: unrecognized option '--stack'
et similaires.
Je sais qu'il est possible d'utiliser
ulimit -s unlimited
mais ce n'est pas sympa de ne pas toujours possible un seul utilisateur de le faire.
Comment puis-je augmenter la taille de la pile sous Linux avec GCC pour une seule application?
- si cela aide: 2.6.18.8-0.9-par défaut #1 SMP Soleil le 10 Février à 22:48:05 UTC 2008 x86_64 x86_64 x86_64 GNU/Linux
- gcc --version: version de gcc 4.1.2 20061115 (version préliminaire) (SUSE Linux)
- En essayant de définir
rlimit_stack
après Pile Choc réhabilitations peut entraîner une défaillance ou de problèmes connexes. Voir aussi Red Hat Problème 1463241
Vous devez vous connecter pour publier un commentaire.
Vous pouvez définir la taille de la pile par programmation avec setrlimit, par exemple
Remarque: même lors de l'utilisation de cette méthode pour augmenter la taille de la pile, vous ne devez pas déclarer les grandes variables locales dans
main()
lui-même, puisque vous pouvez ainsi obtenir un débordement de la pile dès que vous entrezmain()
, avant lagetrlimit
/setrlimit
code a eu une chance de changer la taille de la pile. Toutes les grandes variables locales doivent donc être définis uniquement dans les fonctions qui sont par la suite appelé à partir demain()
, après la taille de la pile a été augmenté.#include
s pour votre système d'exploitation, par exemple, pour Mac OS X, il serait#include <sys/resource.h>
.segmentation fault
. Seulement quand je le lance en ligne de commandeulimit -s 16000
alors je peux définir une variable locale commechar x [14000000]
. Apparemment la taille de la pile n'est pas définie par le présent code. Une idée?main()
lui-même ? Qui ne fonctionnent pas, bien sûr, parce que vous obtiendrez un débordement de la pile avant même d'arriver à lagetrlimit
/setrlimit
code. Mettre les grandes variable locale dans une autre fonction et ensuite appeler cette fonction à partir demain
(après lagetrlimit
/setrlimit
code).main()
mais après j'ai mis la nouvelle limite. Apparemment, cela ne fonctionne pas. Quand je l'appelle demain()
une fonction qui a un énorme variable locale, alors il fonctionne. Je l'ai vérifié maintenant avec des limites différentes et tout fonctionne parfaitement. Conclusion: La limite d'empilement doivent être définis dansmain()
pour être active pour le reste du programme. J'avais aussi fermer lassh
session parce que j'ai été jouer aveculimit -s
et je me suis toujours -1 comme code de retour.Au lieu de
stack_size
, utilisez--stack
comme suit:Cet exemple devrait vous donner 4 MO d'espace de pile. Travaux sur de MinGW GCC, mais comme la page de manuel dit, "Cette option est spécifique à i386 PE port ciblé de l'éditeur de liens" (c'est à dire ne fonctionne que pour la sortie des binaires pour Windows). Semble comme il n'y a pas une option pour les binaires ELF.
Envisager d'utiliser
-fsplit-stack
option https://gcc.gnu.org/wiki/SplitStacks-fsplit-stack
une diminution de la performance de ~20% pour mon cas d'utilisation.Changer avec l'espace bash builtin, ou setrlimit(), ou lors de la connexion
avec PAM (pam_limits.donc).
C'est un réglable
l'utilisateur plafond de ressources; voir RLIMIT_STACK dans setrlimit(2).
http://bytes.com/topic/c/answers/221976-enlarge-stack-size-gcc
setrlimit
peut être fait à l'intérieur de votre code C++, au début demain
.