Como desativo a caixa de diálogo 'Depurar / Fechar aplicativo' no Windows Vista?


86

Quando um aplicativo falha no Windows e um depurador como o Visual Studio é instalado, a seguinte caixa de diálogo modal é exibida:

[Título: Microsoft Windows]

X parou de funcionar

Um problema impediu o programa de funcionar corretamente. O Windows fechará o programa e notificará você se houver uma solução disponível.

[Depurar] [Fechar aplicativo]

Existe uma maneira de desativar esta caixa de diálogo? Ou seja, o programa travou e foi gravado silenciosamente?

Meu cenário é que eu gostaria de executar vários testes automatizados, alguns dos quais travarão devido a bugs no aplicativo em teste. Não quero esses diálogos impedindo a execução da automação.

Pesquisando, acho que encontrei a solução para desabilitar isso no Windows XP, que é destruir esta chave de registro:

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

No entanto, isso não funcionou no Windows Vista.


Nuking a chave AeDebug \ Debugger não teve nenhum efeito para mim no Windows XP, seja em aplicativos de console compilados com bibliotecas de depuração ou sem depuração.
— rptb1

Respostas:


56

Para forçar o Relatório de Erros do Windows (WER) a fazer um despejo de memória e fechar o aplicativo, em vez de solicitar que você depure o programa, você pode definir estas entradas de registro:

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

Depois que isso for definido, quando seus aplicativos travarem, você deverá ver os arquivos * .hdmp e * .mdmp em:

%ALLUSERSPROFILE%\Microsoft\Windows\WER\

3
DefaultConsent = 1 parece ser o padrão. E o DontShowUI?
— Zitrax de

A documentação do ForceQueue é vaga, não entendi exatamente o que significa.
— Zitrax

2
@NicJ adicione DontShowUI = 1 à sua resposta, é o essencial
— Youda008

1
Também pode ser definido em HKEY_CURRENT_USER, eu acredito
— PJTraill

2
janelas edição de registro é o caminho para o inferno, considere melhor resposta de armenzg
— lowtech

45

Veja aqui:

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

regedit

DWORD HKLM ou HKCU \ Software \ Microsoft \ Windows \ Windows Error Reporting \ DontShowUI = "1"

fará o WER relatar silenciosamente. Então você pode definir

DWORD HKLM ou HKCU \ Software \ Microsoft \ Windows \ Windows Error Reporting \ Disabled = "1"

para impedi-lo de falar com o MS.


Trabalhou para mim na correção de um problema do VSTS Build Agent no qual eu estava tentando executar testes Selenium. Obrigado!
— Stu1986C

36

Não tenho certeza se isso se refere exatamente ao mesmo diálogo, mas aqui está uma abordagem alternativa de Raymond Chen :

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

Sim, chamar SetErrorMode dessa forma evita o diálogo WER mencionado pelo OP.
— Roman Starkov,

2
O problema que tenho com SetErrorMode e o sinalizador SEM_NOGPFAULTERRORBOX é que ele não cria um arquivo de despejo e faz uma entrada no Log de Eventos do Windows. Seu programa simplesmente desaparecerá sem deixar vestígios quando travar. Por esse motivo, acho que a solução de registro é melhor.
— Derek

Isso também funciona para estruturas desatualizadas (desde WinXP).
— Wolf

1
Concordou que isso não é bom para enviar. É realmente útil desbloquear tarefas instáveis ​​para automação, no entanto.
— kayleeFrye_onDeck

31

Tive que desabilitar isso para o trabalho de automação de lançamento no Windows 64 bits para Firefox e fiz o seguinte:

  • gpedit.msc
  • Configuração do computador -> Modelos administrativos
  • Componentes do Windows -> Relatório de erros do Windows
  • Defina "Impedir a exibição da interface do usuário para erros críticos" como Ativado

É semelhante ao que foi realizado para relatórios de experiência do cliente em: http://www.blogsdna.com/2137/fix-windows-installer-explorer-update-has-stopped-working-in-windows-7.htm


13

No meu contexto, desejo apenas suprimir o pop-up para meus testes de unidade e não para todo o sistema. Descobri que uma combinação de funções é necessária para suprimir esses erros, como capturar exceções não tratadas, suprimir verificações de tempo de execução (como a validade do ponteiro de pilha) e os sinalizadores de modo de erro. Isso é o que usei com algum sucesso:

#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

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

Não parece haver nada específico de WPF lá e parece funcionar muito bem no meu aplicativo de console também (.NET 4.6.2 no Windows 10)
— mookid8000


4

Durante o teste, você pode executar com um 'depurador' como o ADPlus anexado, que pode ser configurado de muitas maneiras úteis para coletar dados (minidespejos) em erros e ainda evitar os problemas de diálogo modal que você indicou acima.

Se você deseja obter algumas informações úteis quando seu aplicativo travar na produção, você pode configurar o relatório de erros da Microsoft para obter algo semelhante aos dados ADPlus.


4

Esta não é uma resposta direta à pergunta, pois é uma solução alternativa e a questão é sobre como desativar esse recurso, mas, no meu caso, sou um usuário em um servidor com permissões limitadas e não posso desativar o recurso usando um dos as outras respostas. Então, eu precisava de uma solução alternativa. Isso provavelmente funcionará para pelo menos alguns outros que terminam nesta questão.

Usei o autohotkey portátil e criei uma macro que verifica uma vez por minuto se a caixa pop-up existe e, se existir, clica no botão para fechar o programa. No meu caso, isso é suficiente e deixa o recurso ativado para outros usuários. Requer que eu inicie o script quando executo o programa em risco, mas funciona para minhas necessidades.

O script é o seguinte:

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
}

editar: uma bandeira rápida. Quando outras coisas estão ativas, isso parece tentar ativar os controles na janela de primeiro plano - é para enviá-los ao programa em segundo plano. Se eu encontrar uma correção, edito esta resposta para refleti-la, mas por enquanto, tome cuidado ao usar isso e tentar fazer outro trabalho em uma máquina ao mesmo tempo.


3

Depois de tentar de tudo na internet para me livrar do depurador just in time, encontrei uma maneira simples que realmente funcionou e espero que ajude alguém.

Vá para o Painel de Controle Vá para Ferramentas Administrativas Vá para Serviços Procure na lista o Machine Debug Manager Clique com o botão direito nele e clique em Propriedades. Na guia Geral, procure por Tipo de Inicialização Clique em Desativar. Clique em Aplicar e OK.

Não vi a mensagem do depurador desde então e meu computador está funcionando perfeitamente.


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.