
Когда в Windows 7 я запускаю консольную программу, которая должна аварийно завершить работу, у меня возникают следующие ситуации:
- Если яДвойной кликна нем происходит сбой и "ваша программа дала сбой"открывается всплывающее диалоговое окно
- Если я запущу его черезDOS-консоль, происходит сбой и появляется сообщение "ваша программа дала сбой"открывается всплывающее диалоговое окно
- Если я запущу его черезКонсоль Cygwin, он тихо падает.Нет всплывающего диалогового окна
Обратите внимание, что в Windows XP все работает так, как и ожидалось (открывается всплывающее диалоговое окно...), и я могу отладить аварийно завершившуюся программу.
Это баг cygwin на Windows 7? Проблема конфигурации?
Разные данные
- У меня Cygwin версии 1.7.5, но его удалось воспроизвести с помощью Cygwin 1.7.7.
- Работает на WinXP, но не работает на Cygwin на Windows 7 (32 или 64-разрядной)
- Диалог интересен для целей разработки/отладки.
Я написал следующую программу на C++ в Visual Studio 2008 в режиме отладки (32-битная или 64-битная версия дает одинаковый результат):
#include <cstdio>
#include <windows.h>
int main()
{
printf("It should crash now...") ;
::DebugBreak() ;
return 0 ;
}
Был ::DebugBreak()
заменен на int * p = NULL ; *p = 42 ;
(который, как предполагается, приводит к сбою с исключением нарушения прав доступа), с точно такими же результатами ошибок в Cygwin.
Спасибо !
решение1
Я наблюдал ту же проблему с последними версиями Cygwin. Я пока не знаю, что ее вызывает, но функция Windows SetErrorMode, похоже, работает отлично:
{
const UINT oldErrorMode = ::SetErrorMode(0);
::DebugBreak();
::SetErrorMode(oldErrorMode);
}
Просто совет: если вы используете MSVC, используйте встроенную функцию __debugbreak(). Она помещает break в эту точку кода, а не внутрь функции, вызываемой оттуда. Некоторые встроенные ассемблерные коды могут делать этот трюк на других компиляторах.