Windows Vista에서 '디버그 / 응용 프로그램 닫기'대화 상자를 비활성화하려면 어떻게합니까?


86

Windows에서 응용 프로그램이 충돌하고 Visual Studio와 같은 디버거가 설치되면 다음 모달 대화 상자가 나타납니다.

[제목 : Microsoft Windows]

X가 작동을 멈췄습니다.

문제로 인해 프로그램이 올바르게 작동하지 않습니다. Windows는 프로그램을 닫고 솔루션을 사용할 수 있는지 알려줍니다.

[디버그] [응용 프로그램 닫기]

이 대화 상자를 비활성화하는 방법이 있습니까? 즉, 프로그램이 충돌하고 조용히 구워 졌습니까?

내 시나리오는 몇 가지 자동화 된 테스트를 실행하고 싶은데, 그중 일부는 테스트중인 애플리케이션의 버그로 인해 충돌이 발생합니다. 이 대화 상자가 자동화 실행을 지연시키는 것을 원하지 않습니다.

주변을 검색하면 Windows XP에서 이것을 비활성화하는 솔루션을 찾았다 고 생각합니다.

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

그러나 Windows Vista에서는 작동하지 않았습니다.


AeDebug \ Debugger 키를 Nuking해도 Windows XP에서는 디버깅 또는 디버깅이 아닌 라이브러리로 컴파일 된 콘솔 앱에 영향을 미치지 않았습니다.
rptb1 2013-07-15

답변:


56

WER (Windows 오류보고)에서 프로그램을 디버그하라는 메시지를 표시하는 대신 크래시 덤프를 수행하고 앱을 닫도록 강제하려면 다음 레지스트리 항목을 설정할 수 있습니다.

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

1
또한 HKEY_CURRENT_USER 아래에 설정할 수 있습니다, 저는 믿습니다
PJTraill

2
Windows 레지스트리 편집은 IT 지옥으로가는 길입니다. armenzg의 답변을 고려하는 것이 좋습니다
lowtech

45

여길 봐:

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

regedit

DWORD HKLM 또는 HKCU \ Software \ Microsoft \ Windows \ Windows 오류보고 \ DontShowUI = "1"

WER가 조용히보고합니다. 그런 다음 설정할 수 있습니다.

DWORD HKLM 또는 HKCU \ Software \ Microsoft \ Windows \ Windows 오류보고 \ Disabled = "1"

MS와의 대화를 중지합니다.


Selenium 테스트를 실행하려는 VSTS 빌드 에이전트 문제를 해결하는 데 도움이되었습니다. 감사!
Stu1986C

36

이것이 정확히 동일한 대화를 참조하는지 확실하지 않지만 여기에 Raymond Chen 의 다른 접근 방식이 있습니다 .

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

예, 이와 같이 SetErrorMode를 호출하면 OP에서 언급 한 WER 대화 상자를 방지 할 수 있습니다.
Roman Starkov

2
SetErrorMode 및 SEM_NOGPFAULTERRORBOX 플래그에 대한 문제는 덤프 파일을 생성하지 않고 Windows 이벤트 로그에 항목을 생성하지 않는다는 것입니다. 프로그램이 충돌하면 흔적도없이 사라집니다. 이런 이유로 레지스트리 솔루션이 더 좋다고 생각합니다.
Derek

이는 오래된 프레임 워크에서도 작동합니다 (WinXP 이후).
Wolf

1
함께 배송하기에 좋지 않다는 데 동의했습니다. 그러나 불안정한 자동화 작업을 차단 해제하는 것은 정말 유용합니다.
kayleeFrye_onDeck

31

Firefox 용 Windows 64 비트에서 릴리스 자동화 작업을 위해이 기능을 비활성화해야했고 다음을 수행했습니다.

  • 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 별이고, 그것은 (Windows에서 .NET 4.6.2 10)도 내 콘솔 응용 프로그램에서 잘 작동하는 것 같다
mookid8000


4

테스트 중에 ADPlus와 같은 '디버거'를 연결 하여 실행할 수 있습니다. ADPlus 는 오류에 대한 데이터 (미니 덤프)를 수집하는 여러 유용한 방법으로 구성 할 수 있지만 위에서 언급 한 모달 대화 상자 문제를 방지 할 수 있습니다.

프로덕션에서 앱이 충돌 할 때 유용한 정보 를 얻으려면 ADPlus 데이터와 유사한 것을 가져 오도록 Microsoft 오류보고 를 구성 할 수 있습니다 .


4

이것은 해결 방법이고 질문은 해당 기능을 비활성화하는 방법에 관한 것이므로 질문에 대한 직접적인 대답은 아니지만 제 경우에는 권한이 제한된 서버의 사용자이며 다음 중 하나를 사용하여 기능을 비활성화 할 수 없습니다. 다른 답변. 그래서 해결 방법이 필요했습니다. 이것은이 질문으로 끝나는 적어도 다른 사람들에게 효과적 일 것입니다.

나는 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
}

편집 : 빠른 플래그. 다른 일이 일어나면 전경 창에서 컨트롤을 활성화하려고 시도하는 것처럼 보입니다. 백그라운드에서 프로그램으로 보내야합니다. 수정 사항을 찾으면이 답변을 수정하여 반영 하겠지만 지금은 이것을 사용하고 동시에 컴퓨터에서 다른 작업을 시도 할 때주의해야합니다.


3

Just In Time 디버거를 제거하기 위해 인터넷에서 다른 모든 것을 시도한 후 실제로 작동하는 간단한 방법을 찾았으며 다른 사람을 도울 수 있기를 바랍니다.

제어판으로 이동 관리 도구로 이동 서비스로 이동 Machine Debug Manager의 목록을 찾아 마우스 오른쪽 버튼으로 클릭하고 속성을 클릭합니다. 일반 탭에서 시작 유형을 찾아 사용 안함을 클릭합니다. 적용 및 확인을 클릭하십시오.

그 이후로 디버거 메시지를 보지 못했고 내 컴퓨터가 완벽하게 실행되고 있습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.