Windows 7 の Cygwin でプログラムがクラッシュしてもクラッシュ ダイアログが表示されない

Windows 7 の Cygwin でプログラムがクラッシュしてもクラッシュ ダイアログが表示されない

Windows 7 でクラッシュするはずのコンソール プログラムを起動すると、次のようなケースが発生します。

  • もし私がダブルクリッククラッシュし、「プログラムがクラッシュしました」ダイアログポップアップが開きます
  • もし私がそれをDOSコンソールクラッシュし、「プログラムがクラッシュしました」ダイアログポップアップが開きます
  • もし私がそれをCygwin コンソール、静かにクラッシュします。ダイアログポップアップなし

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 ;
}

は(アクセス違反例外でクラッシュするはず)::DebugBreak()に置き換えられましたが、Cygwin ではまさにバグのある結果になります。int * p = NULL ; *p = 42 ;

ありがとう !

答え1

Cygwin の最新バージョンでも同じ問題が発生しました。原因はまだわかりませんが、Windows の SetErrorMode 関数はうまく機能しているようです。

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

ヒント: MSVC を使用している場合は、代わりに __debugbreak() 組み込み関数を使用してください。これにより、そこから呼び出される関数内ではなく、コード内のそのポイントでブレークが設定されます。一部のインライン アセンブリでは、他のコンパイラでこのトリックが実行される場合があります。

関連情報