Question

J'ai le problème suivant avec mon programme C: Quelque part est un débordement de pile. En dépit de la compilation sans optimisation et avec des symboles de débogage, le programme se termine avec cette sortie (à l'intérieur ou à l'extérieur de gdb sous Linux):

Programme a pris fin avec un signal SIGSEGV, Segmentation fault. Le programme n'existe plus.

La seule façon que je pouvais détecter que ce débordement est en fait la pile est en cours d'exécution du programme par valgrind. Est-il possible que je peux forcer en quelque sorte le système d'exploitation pour vider une trace de la pile d'appels qui me aider à localiser le problème?

Malheureusement, gdb ne me permet pas de robinet facilement soit dans le programme.

Était-ce utile?

La solution

Si vous permettez au système de fichiers de sauvegarde de base, vous pouvez les analyser avec gdb:

$ ulimit -c unlimited # bash sentence to allow for infinite sized cores
$ ./stack_overflow
Segmentation fault (core dumped)
$ gdb -c core stack_overflow
gdb> bt
#0  0x0000000000400570 in f ()
#1  0x0000000000400570 in f ()
#2  0x0000000000400570 in f ()
...

Quelques fois je l'ai vu un fichier de base mal généré qui avait une trace de pile incorrecte, mais dans la plupart des cas, le bt donnera un tas d'appels récursifs à la même méthode.

Le fichier de base pourrait avoir un autre nom qui pourrait inclure l'ID du processus, cela dépend de la configuration par défaut du noyau dans votre système actuel, mais il peut être contrôlé avec (en tant que root ou avec sudo):

$ sysctl kernel.core_uses_pid=1

Autres conseils

Avec GCC, vous pouvez essayer ceci:

  

-fstack-protector
      Émettre un code supplémentaire pour vérifier les débordements de mémoire tampon, telles que les attaques brisant de la pile. Cela se fait en ajoutant une variable de garde aux fonctions avec des objets vulnérables. Cela comprend les fonctions qui font appel alloca et des fonctions avec des tampons de plus de 8 octets. Les gardes sont initialisés lorsqu'une fonction est saisie, puis vérifié lorsque la fonction sort. Si un chèque de garde échoue, un message d'erreur est affiché et le programme sort.

     

-fstack-protector-all
      Comme -fstack-protecteur, sauf que toutes les fonctions sont protégées.

http: // gcc. gnu.org/onlinedocs/gcc-4.3.3/gcc/Optimize-Options.html#Optimize-Options

Quand un programme meurt avec SIGSEGV, il déverse normalement noyau sur Unix. Pourriez-vous charger de ce noyau dans le débogueur et vérifier l'état de la pile?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top