3

Когда в 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 ответ1

4

Я наблюдал ту же проблему с последними версиями Cygwin. Я еще не знаю, что вызывает это, но функция Windows SetErrorMode, кажется, работает удовольствие:

{
  const UINT oldErrorMode = ::SetErrorMode(0);
  ::DebugBreak();
  ::SetErrorMode(oldErrorMode);
}

Просто совет: если вы используете MSVC, используйте вместо этого встроенную функцию __debugbreak(). Он ставит разрыв в этой точке кода, а не внутри функции, вызываемой оттуда. Некоторые встроенные сборки могут сделать этот трюк на других компиляторах.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .