2017-05-20 5 views
-5

Je développe une application de géométrie computationnelle en C++. Cela fonctionne en parallèle en utilisant des threads et openmp. Ainsi, j'obtiens quelques valeurs géométriques (telles que des noeuds, des bords, etc.) et produisons une sortie. Cela fonctionne presque toujours parfait. Cependant, il y a des cas comme 1% que je reçois ce résultat foiré. L'application ne plante pas mais j'obtiens de très mauvais résultats, comme ma sortie a des valeurs de mémoire aléatoires. Mais même si je cours deux fois sur les mêmes données, la deuxième fois ça fonctionnera bien. J'ai utilisé valgrind et helgrind mais ils n'ont détecté aucune erreur liée. Donc, je commence à manquer d'idées pour le tracer. Y at-il un autre outil à essayer qui détecte les erreurs de thread possibles mieux que helgrind? Ou est-il une idée sur la façon de reproduire un tel problème et comment enregistrer l'état exact qui a conduit à ce bug?Trace non-reproductible en C++

+1

Bienvenue dans Stack Overflow. Veuillez prendre le temps de lire [The Tour] (http://stackoverflow.com/tour) et de consulter le contenu du [Centre d'aide] (http://stackoverflow.com/help/asking) quoi et comment vous pouvez demandez ici. –

+1

Bugs intermittents 101: consignez et notez tout. Changez les entrées, le nombre de threads, consignez et notez tout. Simplifier, commenter les appels, etc., même si les résultats seront évidemment erronés, en recherchant la cohérence (même si cette 'cohérence' est qu'elle se bloque constamment - c'est une très bonne chose :), connectez-vous et notez tout. Finalement, vous trouverez le bug. Je crains qu'il n'y ait pas de substitut pour le travail dur avec le débogueur et l'enregistreur, (et l'expérience :). – ThingyWotsit

+0

Si cela vous fait vous sentir mieux, (et ce ne sera pas le cas :), mon record pour l'éradication d'un bug intermittent est de six mois. B) une mise à jour particulière a été déclenchée par plus d'un des périphériques ET c) l'arrêt du système était incontrôlé (par exemple, coupure de courant). – ThingyWotsit

Répondre

0

Avertissement: Je ne l'ai pas utilisé l'approche ci-dessous à l'aide OpenMP, mais en fonction de ce que je viens de regarder en haut, il semble être possible.


J'ai eu un bug similaire que j'avais besoin de reproduire dans GDB. This post m'a aidé à exécuter l'application indéfiniment jusqu'à ce qu'une erreur de segmentation se produise.

Nous pourrions adapter cette réponse pour répondre à votre question en ajoutant un point de rupture conditionnel qui frappe lorsque la valeur de sortie n'est pas comme prévu.

set pagination off 
break exit 
commands 
run 
end 
break file.cpp:123 if some_condition_holds 

Maintenant, si vous courriez ci-dessus avec GDB il courrait indéfiniment jusqu'à ce que le mauvais résultat se produit (some_condition_holds est vrai). Ensuite, nous pouvons passer au fil approprié en utilisant le inferior commands:

info inferiors 
inferior inferior_num