2010-04-14 1 views
11

J'essaye de déboguer un problème dans une DLL écrite en C qui continue à causer des violations d'accès. J'utilise Visual C++ 2008, mais le code est C. droite.Comment faire pour que le débogueur de VC++ casse des exceptions?

Je suis habitué à Delphi, où si une exception se produit lors de l'exécution sous le débogueur, le programme se casse immédiatement au débogueur et il vous donnera une chance d'examiner l'état du programme. Dans Visual C++, cependant, tout ce que je reçois est un message dans l'onglet Sortie:

First-chance exception at blah blah blah: Access violation reading location 0x04410000. Pas de pause, rien. Il va juste et décompose la pile jusqu'à ce qu'elle soit de retour dans mon EXE Delphi, qui reconnaît quelque chose qui ne va pas et m'avertit, mais à ce moment-là j'ai perdu plusieurs couches de call call et je ne sais pas ce qui se passe. J'ai essayé d'autres techniques de débogage, mais quoi qu'il fasse se déroule au sein d'une boucle imbriquée dans une macro C qui est appelée plus de 500 fois, et c'est juste un peu au-delà de mes compétences (ou de ma patience) pour Tracer à travers.

je me dis que il doit y avoir un moyen d'obtenir l'exception « première chance » de me donner en fait une « chance » pour y faire face. Il y a probablement un paramètre de configuration «Interrompre immédiatement les exceptions de la première chance» que je ne connais pas, mais il ne semble pas que ce soit tout ce qui puisse être découvert.

Est-ce que quelqu'un sait où il est et comment l'activer?

Répondre

16

Dans le menu Déboguer, sélectionnez Exceptions et cochez les cases des exceptions que vous souhaitez le débogueur pour briser le. "Violation d'accès" est sous "Exceptions Win32".

+0

Merci. Ça a marché. Je me demande pourquoi la violation d'accès n'est pas vérifiée par défaut ... –

+0

@Mason: Pas de problème. Je ne pense pas qu'aucun d'entre eux sont vérifiés par défaut. Ma conjecture est qu'il y a une pénalité de performance assez importante quand "break on exception" est activé (bien que je ne le sache pas vraiment). –

+0

Je ne le pense pas. Je ne connais pas très bien le C++, mais en Delphi, la pénalité de performance est nulle jusqu'à ce qu'elle tombe sur un, et quand cela arrive, cela signifie généralement que quelque chose s'est mal passé et que le débogueur est exactement là où vous voulez. être. –

1

Vous pouvez également créer un point d'arrêt de données en utilisant l'adresse indiquée dans la ligne « exception de première chance ... ».

À la suite de la réponse de James, les exceptions que vous recherchez sont sous la section des exceptions Win32. Vous devriez voir la violation d'accès là-bas.

+0

Cela fonctionnerait-il? C'est une erreur "read of", et les points AFAIK ne s'arrêtent que si vous changez la valeur à l'adresse en question. –

+0

Vous pouvez également rompre lorsque l'exécution atteint un emplacement spécifique (je pense que c'est juste une option dans la boîte de dialogue des propriétés du point d'arrêt). –

Questions connexes