
Wenn ich unter Windows 7 ein Konsolenprogramm starte, das abstürzen sollte, treten die folgenden Ereignisse auf:
- Wenn ichDoppelklickdarauf stürzt es ab und ein "Ihr Programm ist abgestürzt"Dialog-Popup öffnet sich
- Wenn ich es über einDOS-Konsole, es stürzt ab und ein "Ihr Programm ist abgestürzt"Dialog-Popup öffnet sich
- Wenn ich es über einCygwin-Konsole, es stürzt lautlos ab.Kein Dialog-Popup
Beachten Sie, dass unter Windows XP alles wie erwartet funktioniert (ein Dialog-Popup wird geöffnet ...) und ich das abgestürzte Programm debuggen kann.
Ist das ein Cygwin-Fehler unter Windows 7? Ein Konfigurationsproblem?
Sonstige Daten
- Mein Cygwin ist 1.7.5, wurde aber mit einem Cygwin 1.7.7 reproduziert.
- Es funktioniert unter WinXP, schlägt aber unter Cygwin unter Windows 7 (32 oder 64-Bit) fehl.
- Der Dialog ist für Entwicklungs-/Debugzwecke interessant
Ich habe das folgende C++-Programm in Visual Studio 2008 im Debug-Modus geschrieben (32 Bit oder 64 Bit haben das gleiche Ergebnis):
#include <cstdio>
#include <windows.h>
int main()
{
printf("It should crash now...") ;
::DebugBreak() ;
return 0 ;
}
wurde ::DebugBreak()
durch ersetzt int * p = NULL ; *p = 42 ;
(das mit einer Zugriffsverletzungsausnahme abstürzen sollte), mit genau den fehlerhaften Ergebnissen unter Cygwin.
Danke !
Antwort1
Ich habe dasselbe Problem bei neueren Versionen von Cygwin festgestellt. Ich weiß noch nicht, woran es liegt, aber die Windows-Funktion SetErrorMode scheint wunderbar zu funktionieren:
{
const UINT oldErrorMode = ::SetErrorMode(0);
::DebugBreak();
::SetErrorMode(oldErrorMode);
}
Nur ein Tipp: Wenn Sie MSVC verwenden, verwenden Sie stattdessen die intrinsische Funktion __debugbreak(). Sie fügt den Break an dieser Stelle im Code ein und nicht in einer von dort aus aufgerufenen Funktion. Einige Inline-Assembler können diesen Trick unter anderen Compilern ausführen.