2017-10-10 6 views
0

J'ai un gros morceau de code qui a des opérations réseau et je ne peux pas le coller ici.Processus de vidage lors du démarrage avec Linux gdb

Mon problème est quand je le démarre avec gdb il montre le défaut seg dès que le processus commence. Mais quand je l'exécute sans gdb, il continue de fonctionner et à un moment donné, il crée des erreurs. Quelle peut être la raison? Y a-t-il de la corruption de mémoire à coup sûr?

+0

S'il vous plaît ajouter votre code à la poste. Avez-vous essayé de savoir à quel moment l'erreur est survenue? – moooeeeep

+0

Une raison possible: vous travaillez dans une application multi-thread et il y a une mauvaise synchronisation entre vos threads, vous pouvez déboguer votre problème en utilisant backtrace au début et ensuite utiliser sleep pour retarder quelques instructions, de sorte que vous serez Sûr de qui est à l'origine du seg Fault – Mouin

+0

Avez-vous essayé d'exécuter le même code dans 'valgrind'? – dlmeetei

Répondre

0

Une raison probable pour laquelle le processus se bloque immédiatement dans GDB est que GDB désactive la randomisation de l'espace adresse ASLR.

Vous pouvez réactiver ASLR dans gdb comme ceci:

(gdb) set disable-randomization off 
(gdb) run 

Vous pouvez désactiver ASLR en dehors de GDB comme ceci:

setarch x86_64 -R ./a.out ... 

Ou vous pouvez désactiver le système ASLR large comme ceci:

sudo -c "echo 0 > /proc/sys/kernel/randomize_va_space" 

Y at-il une corruption de mémoire pour sur e?

Il y a un bug quelque part à coup sûr. Que ce soit la corruption de la mémoire ou un autre bug dépend exactement comment et le processus se bloque, et vous ne nous avez pas dit tous les détails pertinents.