Windows Vistaで[デバッグ/アプリケーションを閉じる]ダイアログを無効にするにはどうすればよいですか?


86

Windowsでアプリケーションがクラッシュし、Visual Studioなどのデバッガーがインストールされると、次のモーダルダイアログが表示されます。

[タイトル:Microsoft Windows]

Xが機能しなくなった

問題が発生したため、プログラムが正しく機能しなくなりました。Windowsはプログラムを閉じ、解決策が利用可能かどうかを通知します。

[デバッグ] [アプリケーションを閉じる]

このダイアログを無効にする方法はありますか?つまり、プログラムがクラッシュしてサイレントに書き込みますか?

私のシナリオは、いくつかの自動テストを実行したいというものです。そのうちのいくつかは、テスト中のアプリケーションのバグが原因でクラッシュします。これらのダイアログが自動化の実行を停止させたくありません。

周りを検索すると、Windows XPでこれを無効にするための解決策が見つかったと思います。これは、このregキーを無効にします。

HKLM \ Software \ Microsoft \ Windows NT \ CurrentVersion \ AeDebug \ Debugger

ただし、これはWindowsVistaでは機能しませんでした。


AeDebug \ Debuggerキーを削除しても、Windows XPでは、デバッグライブラリまたは非デバッグライブラリでコンパイルされたコンソールアプリのいずれでも効果がありませんでした。
rptb1 2013

回答:


56

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\

3
DefaultConsent = 1がデフォルトのようです。DontShowUIはどうですか?
Zitrax 2011年

ForceQueueのドキュメントはあいまいで、意味が正確にわかりません。
Zitrax 2011年

2
@NicJはあなたの答えにDontShowUI = 1を追加してください、それは不可欠なものです
Youda008 2014

1
HKEY_CURRENT_USERの下にも設定できると思います
PJTraill 2016年

2
Windowsレジストリの編集は、ITの地獄への道です。armenzgからの回答を検討してください
ローテク

45

ここを参照してください:

http://msdn.microsoft.com/en-us/library/bb513638.aspx

regedit

DWORDHKLMまたはHKCU \ Software \ Microsoft \ Windows \ Windowsエラー報告\ DontShowUI = "1"

WERにサイレントレポートを作成します。その後、設定することができます

DWORDHKLMまたはHKCU \ Software \ Microsoft \ Windows \ Windows Error Reporting \ Disabled = "1"

MSとの通信を停止します。


Seleniumテストを実行しようとしていたVSTSビルドエージェントの問題を修正するために働いた。ありがとう!
Stu1986C 2018

36

これはまったく同じダイアログを指すが、ここから別のアプローチであれば、私はわからないレイモンドチェン

DWORD dwMode = SetErrorMode(SEM_NOGPFAULTERRORBOX);
SetErrorMode(dwMode | SEM_NOGPFAULTERRORBOX);

はい、そのようにSetErrorModeを呼び出すと、OPによって言及されたWERダイアログが防止されます。
ローマンスターコフ2010

2
SetErrorModeとSEM_NOGPFAULTERRORBOXフラグで発生する問題は、ダンプファイルが作成されず、Windowsイベントログにエントリが作成されないことです。プログラムがクラッシュすると、プログラムは跡形もなく消えてしまいます。このため、レジストリソリューションの方が優れていると思います。
デレク

これは、古いフレームワーク(WinXP以降)でも機能します。
オオカミ

1
これを同梱するのは良くないことに同意しました。ただし、不安定な自動化タスクのブロックを解除すると非常に便利です。
kayleeFrye_onDeck 2017

31

Firefox用のWindows64ビットでのリリース自動化作業のためにこれを無効にする必要があり、次のことを行いました。

  • gpedit.msc
  • コンピューターの構成->管理用テンプレート
  • Windowsコンポーネント-> Windowsエラー報告
  • 「重大なエラーに対するユーザーインターフェイスの表示を防止する」を有効に設定します

これは、カスタマーエクスペリエンスレポートで達成されたものと似ていますhttp//www.blogsdna.com/2137/fix-windows-installer-explorer-update-has-stopped-working-in-windows-7.htm


13

私のコンテキストでは、システム全体ではなく、単体テストのポップアップを抑制したいだけです。未処理の例外のキャッチ、実行時チェック(スタックポインターの有効性など)の抑制、エラーモードフラグなど、これらのエラーを抑制するには、関数の組み合わせが必要であることがわかりました。これは私がいくつかの成功を収めて使用したものです:

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

8

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

そこにはWPF固有のものがないようで、コンソールアプリケーションでも問題なく動作するようです(
Windows10の.NET4.6.2

4

アプリケーションを終了するだけの未処理の例外フィルターを実装してから、そのフィルター関数をSetUnhandledExceptionFilter()で設定する必要があります。

セキュアCRTを使用している場合は、独自の無効なパラメーターハンドラーを提供し、これを_set_invalid_parameter_handler()で設定する必要もあります。

このブログ投稿にもいくつかの情報があります:http//blog.kalmbachnet.de/?postid = 75


4

テスト中は、ADPlusのような「デバッガー」を接続して実行できますて実行できます。これは、エラーに関するデータ(ミニダンプ)を収集し、上記のモーダルダイアログの問題を防ぐために多くの便利な方法で構成できます。

本番環境でアプリがクラッシュしたときに役立つ情報を取得したい場合は、ADPlusデータに類似したものを取得するようにMicrosoftエラー報告を構成できます。


4

これは回避策であり、質問はその機能を無効にする方法に関するものであるため、これは質問に対する直接の答えではありませんが、私の場合、私は制限された権限を持つサーバー上のユーザーであり、次のいずれかを使用して機能を無効にすることはできません他の答え。そのため、回避策が必要でした。これは、この質問にたどり着く少なくとも他の何人かにとってはうまくいくでしょう。

私はautohotkeyportableを使用して、ポップアップボックスが存在するかどうかを1分に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
}

編集:クイックフラグ。他のものが起動しているとき、これはフォアグラウンドウィンドウのコントロールをアクティブにしようとしているようです-それはバックグラウンドでプログラムに送信することになっています。修正が見つかったら、それを反映するようにこの回答を編集しますが、今のところ、これを使用すると同時にマシンで他の作業を実行しようとする場合は注意が必要です。


3

ジャストインタイムデバッガーを取り除くためにインターネット上の他のすべてを試した後、私は実際に機能する簡単な方法を見つけました、そして私は他の誰かを助けることを願っています。

コントロールパネルに移動します。管理ツールに移動します。サービスに移動します。MachineDebugManagerのリストを右クリックし、[プロパティ]をクリックします。[全般]タブで、[スタートアップの種類]を探します。[無効にする]をクリックします。[適用]と[OK]をクリックします。

それ以来、デバッガメッセージが表示されておらず、コンピュータは完全に実行されています。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.