2008-11-19 8 views
4

Je donne les résultats suivants:Pourquoi Visual C++ n'atteint pas de point d'arrêt ou ne passe pas par une fonction spécifique?

classA::FuncA() 
{ 
... code 
    FuncB(); 
... code 
} 

classA::FuncB(const char *pText) 
{ 
    SelectObject(m_hDC, GetStockObject ( SYSTEM_FONT)); 
    wglUseFontBitmaps(m_hDC, 0, 255, 1000); 
    glListBase(1000); 
    glCallLists(static_cast<GLsizei>(strlen(pText)), GL_UNSIGNED_BYTE, pText); 
} 

Je peux frapper des points d'arrêt partout dans FoncA. Si j'essaie d'entrer dans FuncB, il va plus loin. Il acceptera un point d'arrêt dans FuncB, mais ne le touchera jamais. Je sais qu'il exécute FuncB, parce que je peux mettre un appel MessagBox() dans FuncB et obtenir la boîte de message. Je suis nouveau sur VS2005 après quelques années d'utilisation étendue de VC6. La situation comme celle-ci, je me souviens de mes jours VC6, est si l'information de symbole n'est pas disponible. Cependant, dans ce cas, les deux fonctions sont dans le même fichier, les informations de symbole doivent donc être correctes. Aussi dans ce cas, je pense que vous ne pouvez même pas définir le point d'arrêt.

J'ai essayé tous les stupides vaudous comme la reconstruction de toute la solution.

Quelle chose stupide suis-je dominant?

EDIT: Ajout du code pour FuncB en réponse à un commentaire sur le fait qu'il peut être essentiellement en ligne. (C'est juste l'exemple de code exact de MSDN pour wglUseFontBitmaps [moins les commentaires ici]). Je ne vois pas comment cela entraverait pas franchir chaque appel.

Répondre

6

Assurez-vous que toutes les optimisations du compilateur sont désactivées (/ Od). L'optimisation du compilateur peut provoquer des problèmes avec les points d'arrêt du débogueur.

+0

Ouais, comme le code au point d'arrêt peut même plus exister. –

+0

Cela s'est avéré être le cas. Merci. –

0

Si tout échoue essayer la mise à jour SP1 VS2005 si vous ne l'avez pas déjà ...

sons étrange!

4

Vous ne savez pas quel est le problème, mais une chose que vous pourriez essayer est de regarder le code désassemblé. Vous pouvez basculer entre le code source et la vue désassemblée avec VS. Je n'ai pas l'IDE devant moi au travail, donc les termes pourraient être légèrement décalés.

Si vous mettez le débogueur dans ce mode, vous pouvez voir quelles sont les instructions d'assemblage qui sont en cours d'exécution. Cela aide parfois à déterminer ce genre de problèmes. Parfois, bien que n'étant généralement pas une version de débogage, les appels sont optimisés par le compilateur.

0

Merci d'avoir posté le code. Ce n'est clairement pas ce que j'avais deviné.


Pour l'amour de la postérité, et éclaircir les choses, je pense était que si (1) la fonction était une ligne et (2) le compilateur inline la fonction, (3) le débogueur pourrait ne pas savoir comment pour y entrer. Cette supposition repose sur le fait que some debuggers do have trouble with inlined code and other compiler optimizations. Je ne suis pas assez familier avec le débogueur de Visual Studio pour dire si c'est sur cette liste. Sur la plupart des systèmes utilisant le format stabs, -g permet d'utiliser des informations de débogage supplémentaires que seul GDB peut utiliser; cette information supplémentaire fait que le débogage fonctionne mieux dans GDB mais fera probablement planter d'autres débogueurs ou refusera de lire le programme. ...

GCC vous permet d'utiliser -g avec -O. Les raccourcis pris par le code optimisé peuvent parfois produire des résultats surprenants: certaines variables que vous avez déclarées peuvent ne pas exister du tout; le flux de contrôle peut se déplacer brièvement là où vous ne l'attendiez pas; certaines instructions peuvent ne pas être exécutées car elles calculent des résultats constants ou leurs valeurs étaient déjà à portée de main; Certaines instructions peuvent s'exécuter à des endroits différents car elles ont été déplacées hors des boucles.

Le manuel GCC utilisé pour indiquer que certains compilateurs refuseraient d'émettre des symboles de débogage dans le code optimisé parce que leurs débogueurs ne pouvaient pas le suivre.

0

en fait j'eu un problème similaire, trouvé sur le wasnt de code se compilé quand je courais le programme, alors assurez-vous 'compilez du programme avant d'essayer de l'exécuter

Questions connexes