erreur de segmentation uniquement lorsque vous n'utilisez PAS de débogueur
J'ai un multithread C programme, qui génère systématiquement une erreur de segmentation à un point spécifique dans le programme. Quand je le lance avec gdb, aucun défaut n'est indiqué. Pouvez-vous penser à une raison pourquoi la faute peut se produire uniquement lorsque vous n'utilisez pas le débogueur? C'est assez ennuyeux de ne pas pouvoir l'utiliser pour trouver le problème!!!!
- Ce genre de bug est appelé "Heisenbug" et peut avoir de nombreuses causes.
- Le message d'erreur arrive d'être lié à la fenêtre de gestion et/ou User32.dll?
- J'ai eu un problème comme ça, mon programme ne s'est écrasé à l'aide de GDB. Le problème est unintialized variable de membre de classe a été toujours obtenir la valeur 0 quand j'ai couru mon programme, mais quand je l'ai couru dans GDB, il avait une énorme valeur segfaulted quand je l'ai utilisé comme un index de tableau.
- Ne pas les fenêtres liées - j'utilise Linux 2.6.32-24-generic #43-Ubuntu.
- Avez-vous essayé d'organiser un core dump? Exécuter
ulimit -c unlimited
avant de commencer le programme à l'extérieur du débogueur, puisgdb myprogram core
après il dumps noyau. gdb va alors être en mesure de post mortem votre erreur de segmentation. - Ce qui se passe à ce moment précis dans le programme? Êtes-vous tenter la déférence d'un pointeur? Appeler une autre fonction? Quoi?
Vous devez vous connecter pour publier un commentaire.
Classique Heisenbug. De Wikipedia:
Le débogueur peut être en train de changer le timing, et le masquage d'une condition de course.
Sur Linux, GDB désactive également l'adresse de l'espace de randomisation et de votre blocage peut être spécifique à disposition de l'espace adresse. Essayez
(gdb) set disable-randomization off
.Enfin,
ulimit -c unlimited
et débogage post-mortem (déjà suggérée par Robie) peut fonctionner.Peut-être lors de l'utilisation de
gdb
mémoire mappée dans un emplacement qui votre de sur/sous flux de ne pas empiéter sur la mémoire qui provoque un plantage. Ou il pourrait être une condition de concurrence qui n'est plus l'obtention de trébucher. Bien que cela semble peu intuitive, vous devez être heureux votre programme était assez agréable de s'écraser sur vous.Quelques suggestions
cppcheck
libefence
Par le débogage, vous êtes à l'évolution de l'environnement qu'il est en cours d'exécution. Il semble que vous faites affaire avec une sorte de condition de course, et par les déboguer les choses sont planifiées de façon légèrement différente de sorte que vous ne rencontrerez pas la question. Que, ou les choses sont stockées de manière légèrement différente, de sorte qu'il ne se produit pas. Êtes-vous capable de mettre un peu de débogage de sortie dans le code afin de l'aider à trouver le problème? Qui peut avoir un impact moindre et vous permettent de trouver votre problème.
J'ai vraiment eu ce problème avant! C'était une condition de course, et quand je mettais les pieds si le code avec un débogueur le thread, j'était en était assez lent pour ne pas déclencher la condition de la course. Assez horrible.