Comment installer un gestionnaire DebugBreak?

Nous configurons Appveyor pour notre solution Visual Studio, qui produit une bibliothèque C ++. Quelques-uns de nos tests [dumb] fuzz objects C ++ pour s’assurer qu’ils ne font rien d’inattendu. Sous les versions de débogage, une assertion est déclenchée (et dans les versions libérées, elle est simplement jetée).

Nous utilisons une assertion personnalisée pour éviter le comportement Posix de planter un programme en cours de débogage. Il est montré ci-dessous. Il semble qu’appveyor ou le système d’exploitation supprime le programme si une assertion est déclenchée et qu’un débogueur n’est pas associé:

entrez la description de l'image ici

Nous voulons installer un gestionnaire DebugBreak si un débogueur n’est pas présent. Cela devrait confirmer que c’est l’OS qui tue. Idéalement, le gestionnaire fonctionnera à partir de Windows XP et des versions VS2002 et supérieures (ce sont les combinaisons Windows que nous prenons en charge).

Comment installer un gestionnaire DebugBreak sur les plates-formes Windows?


 # define MYLIB_ASSERT(exp) { \ if (!(exp)) { \ std::ossortingngstream oss; \ oss << "Assertion failed: " << (char*)(__FILE__) << "(" \ << (int)(__LINE__) << "): " << (char*)(__FUNCTION__) \ << std::endl; \ std::cerr << oss.str(); \ __debugbreak(); \ } \ } 

Nous ne pouvons pas vraiment dire qui est responsable à la, car le comportement n’est pas documenté sur MSDN dans les assertions DebugBreak et __debugbreak ou C / C ++ .

Il y a plusieurs façons distinctes de gérer cela.

À partir du processus qui lance celui qui peut appeler DebugBreak() , vous pouvez utiliser WaitForDebugEvent (ou WaitForDebugEventEx ) et ContinueDebugEvent pour gérer les événements de débogage de l’enfant. En d’autres termes, le parent agit en tant que débogueur et l’enfant en tant que débogueur, de la même manière que le débogueur Visual Studio (parmi beaucoup d’autres).

Vous pouvez également vous connecter à un processus en cours à l’aide de DebugActiveProcess . Une fois que vous avez joint, le débogage est en grande partie similaire à un parent déboguant son processus enfant.

Si vous ne pouvez pas (ou ne voulez pas) faire l’une ou l’autre de ces tâches, vous pouvez installer un débogueur post-mortem. Pour ce faire, vous devez spécifier le débogueur dans le registre, comme décrit sur MSDN . Windows dispose d’un “rapport d’erreurs Windows” (WER), qui appelle le débogueur post-mortem spécifié.

Nous voulons installer un gestionnaire DebugBreak si un débogueur n’est pas présent.

vous devez installer le gestionnaire d’exceptions Windows habituel, à l’aide de __try / __except ou de AddVectoredExceptionHandler ou de SetUnhandledExceptionFilter

lorsque l’instruction int 3 est exécutée dans votre application (en appelant __debugbreak ou DebugBreak ) – et que le débogueur est DebugBreak ou ne le gère pas – votre gestionnaire d’exceptions sera appelé avec le code d’exception STATUS_BREAKPOINT .