Windowsでアプリケーションがクラッシュし、Visual Studioなどのデバッガーがインストールされると、次のモーダルダイアログが表示されます。
[タイトル:Microsoft Windows]
Xは動作を停止しました
問題が原因で、プログラムは正常に動作しなくなりました。 Windowsはプログラムを閉じ、解決策が利用可能であれば通知します。
[デバッグ] [アプリケーションを閉じる]
このダイアログを無効にする方法はありますか?つまり、プログラムがクラッシュして、静かに書き込みますか?
私のシナリオは、いくつかの自動化されたテストを実行したいということです。そのうちのいくつかは、テスト中のアプリケーションのバグが原因でクラッシュします。これらのダイアログが自動化の実行を停止させたくありません。
周辺を検索すると、Windows XPでこれを無効にするためのソリューションが見つかりました。
HKLM\Software\Microsoft\Windows NT\CurrentVersion\AeDebug\Debugger
ただし、Windows Vistaでは機能しませんでした。
Windowsエラー報告(WER)で強制的にクラッシュダンプを取得してアプリを閉じるには、プログラムのデバッグを求める代わりに、次のレジストリエントリを設定できます。
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting]
"ForceQueue"=dword:00000001
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\Consent]
"DefaultConsent"=dword:00000001
これを設定した後、アプリがクラッシュすると、次の場所に* .hdmpおよび* .mdmpファイルが表示されます。
%ALLUSERSPROFILE%\Microsoft\Windows\WER\
こちらをご覧ください:
http://msdn.Microsoft.com/en-us/library/bb513638.aspx
再編集
DWORD HKLMまたはHKCU\Software\Microsoft\Windows\Windows Error Reporting\DontShowUI = "1"
wERを静かに報告します。その後、設定できます
DWORD HKLMまたはHKCU\Software\Microsoft\Windows\Windows Error Reporting\Disabled = "1"
mSとの通信を停止します。
これがまったく同じダイアログを指しているかどうかはわかりませんが、ここに Raymond Chen の代替アプローチがあります。
DWORD dwMode = SetErrorMode(SEM_NOGPFAULTERRORBOX);
SetErrorMode(dwMode | SEM_NOGPFAULTERRORBOX);
FirefoxのWindows 64ビットでのリリース自動化作業のためにこれを無効にする必要があり、次のことを行いました。
それは、カスタマーエクスペリエンスレポートで達成されたものと似ています: http://www.blogsdna.com/2137/fix-windows-installer-Explorer-update-has-stopped-working-in-windows-7。 htm
私の文脈では、システム全体ではなく、単体テストのポップアップのみを抑制します。未処理の例外のキャッチ、実行時チェックの抑制(スタックポインターの有効性など)、エラーモードフラグなど、これらのエラーを抑制するには、関数の組み合わせが必要であることがわかりました。これは私がいくつか成功して使用したものです:
#include <windows.h>
#include <rtcapi.h>
int exception_handler(LPEXCEPTION_POINTERS p)
{
printf("Exception detected during the unit tests!\n");
exit(1);
}
int runtime_check_handler(int errorType, const char *filename, int linenumber, const char *moduleName, const char *format, ...)
{
printf("Error type %d at %s line %d in %s", errorType, filename, linenumber, moduleName);
exit(1);
}
int main()
{
DWORD dwMode = SetErrorMode(SEM_NOGPFAULTERRORBOX);
SetErrorMode(dwMode | SEM_NOGPFAULTERRORBOX);
SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)&exception_handler);
_RTC_SetErrorFunc(&runtime_check_handler);
// Run your tests here
return 0;
}
WPFアプリケーションで
[DllImport("kernel32.dll", SetLastError = true)]
static extern int SetErrorMode(int wMode);
[DllImport("kernel32.dll")]
static extern FilterDelegate SetUnhandledExceptionFilter(FilterDelegate lpTopLevelExceptionFilter);
public delegate bool FilterDelegate(Exception ex);
public static void DisableChashReport()
{
FilterDelegate fd = delegate(Exception ex)
{
return true;
};
SetUnhandledExceptionFilter(fd);
SetErrorMode(SetErrorMode(0) | 0x0002 );
}
これは回避策であり、質問はその機能を無効にする方法に関するものであるため、これは質問に対する直接的な回答ではありませんが、私の場合、私は権限が制限されたサーバー上のユーザーであり、他の答え。そのため、回避策が必要でした。これは、少なくともこの質問に終止符を打つ他の一部の人にとってはうまくいくでしょう。
autohotkey portable を使用して、ポップアップボックスが存在するかどうかを1分ごとに確認し、存在する場合はボタンをクリックしてプログラムを閉じるマクロを作成しました。私の場合、それで十分であり、他のユーザーのために機能をオンのままにします。リスクのあるプログラムを実行するときにスクリプトを開始する必要がありますが、それは私のニーズに合っています。
スクリプトは次のとおりです。
sleep_duration = 60000 ; how often to check, in milliseconds.
; 60000 is a full minute
Loop
{
IfWinExist, ahk_class #32770 ; use autohotkey's window spy to confirm that
; ahk_class #32770 is it for you. This seemed to be consistent
; across all errors like this on Windows Server 2008
{
ControlClick, Button2, ahk_class #32770 ; sends the click.
; Button2 is the control name and then the following
; is that window name again
}
Sleep, sleep_duration ; wait for the time set above
}
edit:クイックフラグ。他のものが起動しているとき、これはフォアグラウンドウィンドウでコントロールをアクティブにしようとするようです-バックグラウンドでプログラムに送信することになっています。修正が見つかった場合は、この回答を編集してそれを反映しますが、現時点では、これを使用すると同時に、マシン上で他の作業を同時に行うことに注意してください。
アプリケーションを単に終了する未処理の例外フィルターを実装し、そのフィルター関数を SetUnhandledExceptionFilter() で設定する必要があります。
セキュアなCRTを使用している場合は、独自の無効なパラメーターハンドラーを提供し、これを _ set_invalid_parameter_handler ()で設定する必要があります。
このブログ投稿にもいくつかの情報があります: http://blog.kalmbachnet.de/?postid=75
テスト中に ADPlus接続のような 'デバッガ' を使用して実行できます。これは、エラー時にデータ(ミニダンプ)を収集し、上記のモーダルダイアログの問題を防ぐための多くの便利な方法で構成できます。
アプリが運用環境でクラッシュしたときに有用な情報を取得したい場合は、ADPlusデータに似たものを取得するように Microsoftエラー報告 を構成できます。
ジャストインタイムデバッガーを取り除くためにインターネット上の他のすべてを試した後、実際に機能する簡単な方法を見つけました。
[コントロールパネル]に移動[管理ツール]に移動[サービス]に移動Machine Debug Managerのリストを右クリックして[プロパティ]をクリックし、[全般]タブで[スタートアップの種類]をクリックします。 [適用]および[OK]をクリックします。
それ以来、デバッガーメッセージは表示されず、コンピューターは完全に動作しています。
レジストリの値を変更する代わりに、Windows Server 2008 R2、Windows Server 2012、およびWindows 8でのエラー報告を次のように完全に無効にすることができます:serverWerOptin /disable
https://technet.Microsoft.com/en-us/library/hh875648(v = ws.11).aspx