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

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

[제목 : Microsoft Windows]

X가 작동을 멈췄습니다.

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

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

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

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

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

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

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



답변

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\


답변

여길 봐:

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와의 대화를 중지합니다.


답변

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

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


답변

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

  • gpedit.msc
  • 컴퓨터 구성-> 관리 템플릿
  • Windows 구성 요소-> Windows 오류보고
  • “심각한 오류에 대한 사용자 인터페이스 표시 방지”를 사용으로 설정합니다.

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


답변

단순히 응용 프로그램을 종료하는 처리되지 않은 예외 필터를 구현 한 다음 SetUnhandledExceptionFilter ()로 해당 필터 함수를 설정해야합니다 .

보안 CRT를 사용하는 경우 자체 잘못된 매개 변수 처리기를 제공하고 _set_invalid_parameter_handler ()를 사용 하여 이를 설정해야 합니다.

이 블로그 게시물에도 몇 가지 정보가 있습니다.
http://blog.kalmbachnet.de/?postid=75