2009-10-27 5 views
0

J'ai un projet C++ WIN32. J'ai trouvé un problème que certains symboles peuvent être reconnus par le windbg mais certains ne le reconnaissent pas. Je ne sais pas pourquoi. Les caractéristiques sont les suivantes:Recherche de symboles pour le fichier source C++

1) les deux sont C++ méthode

2), les deux fonctions sont dans un fichier .cpp

3), les deux fonctions sont très proches dans le fichier source et aucun d'eux sont inclus par un #ifdef

4) J'ai utilisé dbh.exe pour vérifier le symbole, le symbole manquant dans le windbg n'est pas non plus dans le fichier pdb.

Je devine si le symbole manquant peut être dû à l'héritage de la classe ? S'il vous plaît suggérer, merci! Bin

+0

Déboguer ou libérer la version? –

Répondre

3

Si vous n'utilisez pas de fonction, tant que ce n'est pas une fonction virtuelle, elle peut être supprimée par l'éditeur de liens. Les objets de données globaux inutilisés peuvent également être supprimés.

+0

Oh, oui, c'est exactement la raison. J'ajoute un appel explicite à cette fonction, puis il apparaît dans le fichier pdb. Merci. Pour être clair, à l'origine la fonction est référencée par pointeur de fonction, à travers le CreateThread(). Je pense que cet appel implicite fait penser au compilateur qu'il n'est pas utilisé par le code, donc il a dépouillé le symbole. S'il y a une méthode pour forcer demander au compilateur d'ajouter la fonction référencée indirectement au fichier de symboles? Merci. –

+0

Si vous prenez l'adresse de la fonction, l'éditeur de liens ne doit pas supprimer la fonction (il ne peut pas vraiment) et il doit laisser des informations symboliques pour la fonction dans les informations de débogage. Pouvez-vous ajouter un peu de code (la signature de la fonction et l'appel CreateThread)? –

+0

En fait, la fonction est appelée avec la fonction transmise en tant qu'adresse à CreateThread(): CreateThread (...func_a); func_a() { func_b(); } func_a est listé dans le fichier pdb mais func_b ne l'est pas. –

0

La fonction a-t-elle déjà été appelée?

Il pourrait aider à donner plus de détails sur la raison pour laquelle vous pensez qu'il est « en raison de l'héritage de la classe »

0

Il semble que le code source peut être incompatible avec les fichiers PDB.

Peut-être que la fonction a été ajoutée après la production du fichier PDB?

Vous pouvez valider en:

  1. Ajouter un point de rupture à une ligne de code que vous connaissez sera exécuté.
  2. Parcourez le code et assurez-vous que le débogueur ne s'arrête pas sur les lignes de code vides (cela impliquerait une incompatibilité entre le code et le fichier PDB).

La première chose que je suggérerais est de reconstruire le code source pour voir si cela résout le problème.

Si cela ne fonctionne pas, veuillez fournir plus d'informations pour nous permettre de vous aider à diagnostiquer cela plus en détail.

Questions connexes