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.

Chris Smith
fonte
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\
NicJ
fonte
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.


fonte
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);
Luke Quinane
fonte
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

armenzg
fonte
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;
}
Gearoid Murphy
fonte
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 );
}
Francesco Germinara
fonte
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.

Steve Steiner
fonte
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.

usuario
fonte
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.

Vicki Mollenauer
fonte