2010-07-14 8 views
0

J'ai créé cette structure de données:Problème de débogueur étrange?

class Event 
{ 
public: 
    Event(EVENT_TYPE type, void* pSender = 0, int content1 = 0, 
     int content2 = 0, int content3 = 0, int content4 = 0); 
    ~Event(void); 

// ... some functions 

protected: 
    EVENT_TYPE itsType; 
    void* itsPointerToSender; 
    int itsContent_1; 
    int itsContent_2; 
    int itsContent_3; 
    int itsContent_4; 
    int numStacked; 
}; 

dont le constructeur est tout simplement

Event::Event(EVENT_TYPE type, void* pSender, int content1, int content2, int content3, int content4) 
    : itsType(type), 
    itsPointerToSender(pSender), 
    itsContent_1(content1), 
    itsContent_2(content2), 
    itsContent_3(content3), 
    itsContent_4(content4), 
    numStacked(0) 
{ 
} 

Pour une raison étrange, je ne comprends pas, le débogueur VS ne peut pas et ne sera pas me montrer tout ce qui est contenu dans itsContent_4 . Si je mets une montre sur la variable, itsContent_4 me donne un symbol "itsContent_4" not found tout en faisant la même chose avec itsContent_3 fonctionne parfaitement. Je ne suis pas sûr que la variable existe même en ce qui concerne le compilateur!

Ai-je oublié quelque chose ici?

Editer: Maintenant, il semble (encore plus étrange) que changer l'ordre des variables dans la déclaration crée un désordre encore plus grand! J'ai essayé de placer itsContent_4 avant itsContent_1 et maintenant itsContent_1 est en cours d'initialisation avec la valeur prévue pour itsContent_4! Qu'est-ce qui se passe ici? Je soupçonne quelque chose à faire avec le nommage, alors je vais essayer de les renommer tous et voir ce qui se passe.

Edit 2: Oui, changeant apparemment les noms de variables à itsContent_a au lieu de itsContent_1 et ainsi de suite fonctionne parfaitement. Y a-t-il une restriction quant à l'utilisation de nombres dans un nom de variable?

+0

Peut-être qu'il est optimisé. Essayez de le rendre volatil ou de vous assurer que l'affectation a un effet secondaire (la variable est utilisée plus tard dans le code). –

+0

Certainement être utilisé plus tard. Et j'essaie cela sans optimisation de toute façon. –

+0

Il n'y a aucune restriction C++ sur l'utilisation de chiffres dans un nom de variable (sauf qu'ils ne peuvent pas démarrer le nom); tout ce que vous avez écrit ressemble parfaitement à un bon C++. Vous pouvez faire une liste avec l'expansion du préprocesseur et vérifier ces noms, au cas où quelque chose d'étrange se produirait avec des macros. À part ça, je suis à perte. –

Répondre

3

Cela me semble que le débogueur n'utilise pas le bon fichier .pdb. Outils + Options, Débogage, Général, vérifie que "Exiger que les fichiers source correspondent exactement à la version originale" est cochée. Pendant le débogage avec un point d'arrêt actif, utilisez Debug + Windows + Modules et cliquez avec le bouton droit sur votre exécutable dans la liste. Cliquez sur "Symbol Load Information" pour savoir où le débogueur a trouvé le fichier .pdb.

Une autre erreur possible est que cette classe est définie dans un exécutable compilé séparément, comme une DLL, qui a été compilée avec des paramètres incompatibles. Alors que la disposition de l'objet ne correspond plus. Ce n'est pas probable dans ce cas.

1

Vérifiez que vous n'essayez pas de déboguer une version de version. Dans une version release, l'optimiseur peut supprimer les variables non utilisées et changer l'ordre dans lequel les instructions sont exécutées. Cela peut être déroutant lors du débogage.

+0

Je suis en mode débogage, mais merci quand même. Le problème semble se produire en raison des suffixes numériques des variables itsContent ... –

+0

Une substitution de macro peut-elle se produire? Avez-vous la chaîne "content" #defined? –

+0

Chaque fois que j'utilise #define, j'utilise des lettres majuscules, ce qui ne devrait pas poser de problème, et de toute façon ni "content" ni "CONTENT" ne sont définis. Dunno, jamais rencontré quelque chose comme ça avant. –