Je suis en train de traquer un bug vraiment insidieux au travail. L’événement qui semble provoquer le comportement très étrange que j’ai détecté semble être une exception générée lors du traitement d’un rappel du minuteur. L’exception n’est pas gérée par aucun de mes codes. Par conséquent, je m’attendrais à ce que le débogueur soit averti de l’exception non gérée et me prévienne avec une jolie fenêtre pop-up odieuse. Non, au lieu de cela, le message d’exception “première chance” est tracé vers le débogueur et tout se poursuit silencieusement.
J’ai écrit le programme suivant qui illustre ce problème:
#include "stdafx.h" #include class FooExcept { }; VOID CALLBACK Timer(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime) { printf("Here\n"); throw FooExcept(); printf("Also Here\n"); } int _tmain(int argc, _TCHAR* argv[]) { SetTimer(0, 0, 1000, Timer); int bRet; HWND hWnd; MSG msg; // Standard Win32 message pump while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0) { if (bRet == -1) { // handle the error and possibly exit } else { TranslateMessage(&msg); DispatchMessage(&msg); } } return 0; }
La sortie de ce programme dans la fenêtre de sortie de Visual Studio est la suivante:
Exception de première chance à 0x76dbb9bc dans TimerTest.exe: exception Microsoft C ++: FooExcept à l'emplacement de la mémoire 0x0034f743 ..
Bien entendu, mon projet est BEAUCOUP plus compliqué et imprime beaucoup d’informations TRACE au débogueur. Il est facile pour l’exception de la première chance de se perdre dans la sortie.
TOUTEFOIS
Ce n’est pas ma préoccupation. Ceci est clairement une exception que je ne gère pas. Windows décide-t-il subrepticement de gérer cela pour moi? Pourquoi? Si non, pourquoi ne me donne-t-il pas un pop-up flagrant pour m’avertir de l’exception non gérée? Un tel pop-up aurait pu me sauver des jours de débogage.
Ce comportement semble cohérent entre XP / VS 2008 et Win7 / VS 2010.
Ce problème a été corrigé, dans une certaine mesure (voir ci-dessous), dans Windows 7 SP1.
Dans l’article http://support.microsoft.com/kb/976038, vous trouverez la mention d’un correctif et une explication de son utilisation pour désactiver ce comportement. Vous devez soit:
SetProcessUserModeExceptionPolicy
exscope par kernel32.dll
J’ai vérifié dans les mises à jour de Win7 et de WS08R2 SP1.xls que ce correctif est effectivement inclus dans le Service Pack 1 de Windows 7;
En ce qui concerne les raisons pour lesquelles cela a été fait , nous pouvons bien deviner une tentative peu judicieuse d’empêcher les applications héritées de planter au nom de la compatibilité ascendante .