Windows 7의 Cygwin에서 프로그램이 충돌할 때 충돌 대화 상자가 표시되지 않음

Windows 7의 Cygwin에서 프로그램이 충돌할 때 충돌 대화 상자가 표시되지 않음

Windows 7에서 충돌이 발생하는 콘솔 프로그램을 시작하면 다음과 같은 경우가 발생합니다.

  • 만약 내가더블 클릭그것에 충돌이 발생하고 "프로그램이 충돌했습니다"대화상자 팝업이 열립니다
  • 내가 그것을 통해 실행하는 경우DOS 콘솔, 충돌이 발생하고 "프로그램이 충돌했습니다"대화상자 팝업이 열립니다
  • 내가 그것을 통해 실행하는 경우시그윈 콘솔, 조용히 충돌합니다.대화상자 팝업 없음

Windows XP에서는 모든 것이 예상대로 작동하며(대화 상자 팝업이 열립니다...) 충돌한 프로그램을 디버깅할 수 있습니다.

Windows 7의 cygwin 버그입니까? 구성 문제인가요?

기타 데이터

  • 내 Cygwin은 1.7.5인데 Cygwin 1.7.7로 재현했습니다.
  • WinXP에서는 작동하지만 Windows 7(32 또는 64비트)의 Cygwin에서는 작동하지 않습니다.
  • 개발/디버그 목적으로 대화상자가 흥미롭습니다.

Visual Studio 2008에서 디버그로 다음 C++ 프로그램을 작성했습니다(32비트 또는 64비트의 결과는 동일함).

#include <cstdio>
#include <windows.h>

int main()
{
   printf("It should crash now...") ;
   ::DebugBreak() ;
   return 0 ;
}

는 Cygwin에서 정확히 버그가 있는 결과 ::DebugBreak()로 대체되었습니다 int * p = NULL ; *p = 42 ;(액세스 위반 예외로 인해 충돌이 발생하는 것으로 예상됨).

감사해요 !

답변1

최신 버전의 Cygwin에서도 동일한 문제가 관찰되었습니다. 아직 원인이 무엇인지는 모르지만 Windows SetErrorMode 함수가 효과가 있는 것 같습니다.

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

팁: MSVC를 사용하는 경우 대신 __debugbreak() 내장 함수를 사용하세요. 거기에서 호출되는 함수 내부가 아닌 코드의 해당 지점에 중단을 넣습니다. 일부 인라인 어셈블리는 다른 컴파일러에서 이 트릭을 수행할 수 있습니다.

관련 정보