Question

I ont un programme multithread C, ce qui génère systématiquement une erreur de segmentation en un point spécifique dans le programme. Quand je lance avec gdb, aucun défaut apparaît. Pouvez-vous penser à une raison pour laquelle la faute peut se produire que lorsque ne pas utiliser le débogueur? Il est assez ennuyeux de ne pas pouvoir l'utiliser pour trouver le problème!

Était-ce utile?

La solution

Heisenbug . Un article de Wikipédia:

  

Le temps peut aussi être un facteur de bug logiciel inhabituel. L'exécution d'un programme sous le contrôle d'un débogueur peut modifier le calendrier d'exécution du programme par rapport à l'exécution normale. bugs temps sensibles tels que les conditions de course ne peuvent pas se reproduire lorsque le programme est ralenti par des lignes de source unique dans le débogueur pas à pas. Cela est particulièrement vrai lorsque le comportement implique une interaction avec une entité sous le contrôle d'un débogueur, comme lors du débogage de traitement de paquets réseau entre deux machines et un seul est sous le contrôle du débogueur.

Le débogueur peut changer le calendrier, et cacher une condition de course.

Sur Linux, GDB désactive également randomization espace d'adressage, et votre accident peut être spécifique à l'adresse aménagement de l'espace. Essayez (gdb) set disable-randomization off.

Enfin, ulimit -c unlimited et le débogage post-mortem (déjà suggérée par Robie) peuvent travailler.

Autres conseils

Peut-être lors de l'utilisation de la mémoire gdb est mis en correspondance dans un endroit où votre plus / moins flux ne piétiner la mémoire qui provoque un accident. Ou peut-être une condition de course qui ne sont plus se déclenche. Bien que cela semble peu intuitive, vous devriez être heureux votre programme était assez agréable de tomber en panne sur vous.

Quelques suggestions

  1. Essayez un analyseur de code statique tel que le libre cppcheck
  2. Essayez un débogueur malloc () comme libefence
  3. Essayez-le par valgrind

Par le débogage, il vous changez l'environnement dans lequel il fonctionne en. On dirait que vous avez affaire à une sorte de condition de course, et par le déboguer les choses sont programmés un peu différemment de sorte que vous ne rencontrez pas le problème. Que, ou les choses sont stockées d'une manière légèrement différente de sorte qu'il ne se produit pas. Êtes-vous capable de mettre un peu la sortie de débogage dans le code pour aider à déterminer le problème? Cela peut avoir moins d'impact et vous permettre de trouver votre problème.

J'ai totalement eu ce problème avant! Il était une condition de course, et quand je marchais si le code avec un débogueur le fil que je me trouvais était assez lent pour ne pas déclencher la condition de course. Assez horrible.

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