2010-08-17 4 views
0

J'ai une plate-forme cible qui signale quand la mémoire est lue ou écrite, ainsi que quand des verrous (p. Ex. Mutex par exemple) sont pris/libérés. Il signale le compteur de programme, l'adresse de données et le drapeau de lecture/écriture. J'écris un programme pour utiliser cette information sur une machine hôte séparée où les rapports sont reçus afin de ne pas interférer avec la cible. La cible signale déjà ces données, donc je ne change pas du tout le code cible.Comment puis-je détecter une violation d'accès mémoire et/ou des conditions de course de mémoire?

Existe-t-il des références ou des algorithmes déjà disponibles qui effectuent ce type de détection? Par exemple, un moyen de détecter les conditions de concurrence lorsque plusieurs threads essaient d'écrire dans une variable globale sans la protéger en premier.

Je brasse actuellement le mien mais je me convainque qu'il y a certainement du code là-bas qui le fait déjà. Ou au moins un algorithme prouvé de la façon de s'y prendre.

Remarque Il ne s'agit pas de détecter les fuites de mémoire.

Remarque langage d'implémentation C++ est

Je suis en train de faire le code de détection j'écris plate-forme agnostique, donc je suis en utilisant STL et juste C++ standard avec les bibliothèques comme coup de fouet, poco, Loki.

Tous les prospects aideront

merci.

+0

-t-il un rapport aussi des allocations et désaffectations (malloc/nouvelle, libre/supprimer) ? Je suppose que vous voulez dire accéder à de la mémoire non allouée ou libérée lorsque vous parlez de violation d'accès mémoire. – joshperry

+0

voir electricfence – Tom

+0

Oui, il signale les allocations/désallocations, mais ce n'est qu'un sous-ensemble de ce qu'il rapporte. – dubnde

Répondre

4

Il est probablement trop tard pour vous en dissuader, mais cela ne fonctionne pas. Les courses de thread sont causées par des problèmes de synchronisation subtiles entre les threads. Vous ne pouvez jamais diagnostiquer les problèmes liés à la synchronisation avec la journalisation. Heisenbergian, juste la notation modifie le timing d'un fil. Surtout le genre que vous envisagez. Malheureusement, il y a beaucoup de logiciels qui ont été livrés avec la journalisation activée car elle ne piquerait pas avec elle éteint.

L'élimination des punaises est difficile. Le type d'outil qui fonctionne est celui qui intentionnellement injecte des retards aléatoires dans le code. Microsoft CHESS est un exemple, fonctionne aussi sur du code natif.

+0

Merci. Réponse résolument utile et perspicace. Le code qui s'exécute sur la cible est déjà instrumenté pour signaler les informations que j'ai mentionnées dans la question. J'essaie donc de traiter les événements déjà signalés par la cible. Il n'y a rien à éteindre/allumer dans ce cas. Je prendrai votre avis en expérimentant avec n'importe quelle solution que j'adopte. De plus, ce n'est pas une question de temps que j'étudie. Plus de contrôle d'accès. – dubnde

1

Il n'y a pas de manière standard, car les normes C/C++ ne traitent pas des concepts spécifiques au système d'exploitation comme la protection de la mémoire. Jetez un oeil à Breakpad, la bibliothèque de rapports de plantage utilisée par Mozilla sur diverses plates-formes comme OS X, Win32 ou Linux.

+0

merci. Je ne peux pas ajouter de code au code en cours sur la cible. – dubnde

0

Vérifiez cet article par Andrei Alexandrescu: http://www.drdobbs.com/184403766;jsessionid=LKUUBKFR00O0VQE1GHRSKH4ATMY32JVN

Il préconise l'utilisation du mot clé volatile sur vos données qui est accessible par plus d'un fil. Si vous rejetez cette volatilité avec votre mécanisme de verrouillage, vous saurez par l'intermédiaire d'une erreur de compilation où vous devez verrouiller ces données.

J'ai utilisé cette méthode et je l'ai trouvée extrêmement utile.

Espérons que ça aide.

+0

Merci et gardera cet article comme référence. Je n'essaie pas de corriger le code qui s'exécute sur la cible. Juste essayer de détecter s'il y a des violations d'accès à l'exécution. Le conseil dans cet article serait certainement mis à profit une fois qu'un problème a été détecté. Si je devais corriger le code cible incorporé moi-même, cet article et les références connexes seraient certainement utiles. – dubnde

2

Pour répondre à une partie de votre question, les conditions de course sont extrêmement mauvaises précisément parce qu'il n'y a pas de bonne façon de les tester. Par définition, ils sont des séquences d'événements imprévisibles qui sont assez difficiles à diagnostiquer. Le code de détection dépend du fait que la condition de concurrence est en train de se produire, et dans ce cas, il est probable que vous verrez un comportement errant de toute façon.Tout code de test que vous ajoutez peut les rendre plus ou moins susceptibles d'apparaître, ou peut-être même modifier le timing de sorte qu'ils n'apparaissent jamais du tout. Au lieu d'essayer de détecter les conditions de concurrence, pourquoi ne pas essayer de concevoir un programme pour vous aider à le rendre plus résistant? Par exemple, si votre variable globale était simplement encapsulée dans un objet qui connaît toute la protection nécessaire à l'accès, il est impossible que des threads y écrivent simultanément, car une telle interface n'existe pas. Il est plus facile d'empêcher les conditions de course par programmation que d'essayer de les détecter de manière algorithmique (il y a de fortes chances que vous en attrapiez quand même lors du test de l'unité/du sous-système).

+0

+1 pour la recommandation d'encapsulation. Au minimum, écrire des fonctions d'encapsulation simples "getter" et "setter" (qui coordonnent l'accès en utilisant un mutex ou similaire) autour d'une variable globale fait des miracles. Limitez la portée de la variable "brute" de sorte que seul le code d'interface que vous * connaissez * utilise un contrôle d'accès approprié puisse le toucher directement. – bta

+0

Oui. Certainement un conseil judicieux et devrait être pris au sérieux. Cependant, le code est déjà disponible sur la cible et rapporte les accès aux données. Donc j'essaie juste de travailler avec les accès aux données rapportés. – dubnde

Questions connexes