2009-11-06 24 views
4

Nous avons un problème d'écrasement de la mémoire. À un certain moment, au cours de notre programme, un emplacement de mémoire est en cours d'écrasement et provoquant le crash de notre programme. le problème se produit uniquement en mode de libération. quand en debug, tout va bien. qui est un bug classique en C/C++, et très difficile à localiser.Regarder un emplacement de mémoire/installer 'point d'arrêt de données' du code?

Je me suis demandé s'il y avait un moyen d'ajouter du «code de débogage» qui regarderait cet emplacement de mémoire et appellerait un rappel une fois qu'il serait modifié. C'est essentiellement ce qu'un débogueur pourrait faire en mode débogage (un 'point d'arrêt de données') mais nous avons besoin de quelque chose de similaire dans la version.

+0

Quelle plate-forme êtes-vous? – sbi

+0

c'est pour Windows, même si notre projet est multi-plateforme. il se bloque sur Windows (qui a quelques modules différents, donc c'est apparemment sur eux). En tout cas, merci beaucoup à tous! nous allons essayer – Lior

Répondre

10

Si vous pouvez contrôler l'emplacement de la variable, vous pouvez l'attribuer sur une page dédiée et définir les autorisations de la page pour autoriser les lectures en utilisant uniquement VirtualProtect (sous Windows ... non sûr pour Linux).

De cette façon, vous obtiendrez une violation d'accès quand quelqu'un essaie d'y écrire. Avec une fonction de traducteur d'exception, vous pouvez traiter cela comme un rappel.

Même si vous ne pouvez pas déplacer la variable directement (par exemple, c'est un membre de classe), vous pouvez peut-être ajouter un remplissage suffisant autour de la variable pour vous assurer qu'elle est sur une page dédiée.

+2

Ce serait mprotect() sur linux. (J'étais sur le point de poster la même chose - mais vous me battez à elle) – Aaron

+0

Ceci est votre meilleure suggestion. Les points d'arrêt de données performants requièrent un support matériel pour surveiller la plage de mémoire. Si le matériel ne le prend pas en charge, le débogueur doit exécuter une seule étape, puis vérifier manuellement que la plage de mémoire n'a pas changé. –

7

Vous pouvez toujours générer des symboles de débogage pour une partie de code "release". Cela peut toujours être exécuté à travers un débogueur comme vous le feriez en mode "débogage".

J'ai récemment fait quelque chose de similaire avec l'un de nos pilotes de version afin que nous puissions l'utiliser via vtune. Pour le LINK Microsfot, j'ai ajouté le drapeau -DEBUG, pour Microsoft CC, j'ai ajouté -Zi. Tout fonctionne bien. MSKB link

Vous pourriez trouver ce link utile.

1

Il existe des outils pour cela - comme l'agent de tas et boundschecker et beaucoup d'autres qui vont découvrir les écrasements. Fondamentalement, vous avez besoin de sentinelles à la fin de vos allocations de mémoire et ils doivent être vérifiés.

3

En supposant que vous utilisez Windows, utilisez windbg pour déboguer votre programme et vérifier la commande ba, qui se casse lorsque vous accédez à la mémoire.

+0

Utilisez ceci en combinaison avec les symboles de débogage que j'ai mentionnés pour de meilleurs résultats;) – Pod

0

Les API de débogage sont spécifiques à la plate-forme, mais elles existent. Windows et UNIX Les API peuvent être trouvées en ligne.