Pergunta

Quando um aplicativo falhar no Windows e um depurador como o Visual Studio está instalado é exibido o seguinte diálogo modal:

[Título: Microsoft Windows]

X parou de funcionar

Um problema causado o programa para parar funcionando corretamente. Windows irá fechar o programa e notificá-lo se um solução está disponível.

[Debug] [Close Aplicação]

Existe uma maneira para desativar esse diálogo? Ou seja, ter o programa apenas bater e queimar em silêncio?

Meu cenário é que eu gostaria de executar vários testes automatizados, alguns dos quais irão falhar devido a erros no aplicativo em teste. Eu não quero esses diálogos parando a automação prazo.

Como pesquisar em torno Acho que tiver localizado a solução para desativar isso no Windows XP, que é nuking esta chave reg:

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

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

Foi útil?

Solução

Para forçar o Relatório de erros do Windows (WER) para tomar um despejo de memória e fechar o aplicativo, em vez de pedir-lhe para depurar o programa, você pode definir essas entradas do 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 o seu aplicativos acidente, você deve ver * .hdmp e * .mdmp arquivos em:

%ALLUSERSPROFILE%\Microsoft\Windows\WER\

Outras dicas

Veja aqui:

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

regedit

Erro

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

fará relatório WER silenciosamente. Em seguida, você pode definir

Erro

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

para impedi-lo de falar com MS.

Eu não tenho certeza se isso se refere a exatamente o mesmo diálogo, mas aqui é uma abordagem alternativa de Raymond Chen :

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

Eu tive que desativar essa para o trabalho de automação de liberação no Windows 64-bits para Firefox e eu fiz o seguinte:

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

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

No meu contexto, eu só quero suprimir o pop-up para os meus testes de unidade e não para todo o sistema. Descobri que uma combinação de funções são necessárias a fim de suprimir esses erros, tais como captura de exceções não tratadas, suprimindo verificações de tempo de execução (como a validade do ponteiro de pilha) e os sinalizadores do modo de erro. Isto é o que eu 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;
}

aplicação Em 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 );
}

Você tem que implementar um filtro de exceção não tratada, que simplesmente encerra sua aplicação, em seguida, definir que a função de filtro com SetUnhandledExceptionFilter () .

Se você estiver usando o CRT seguro, você também tem que fornecer seu próprio manipulador de parâmetro inválido e definir isso com _ set_invalid_parameter_handler ().

Este post tem algumas informações muito: http://blog.kalmbachnet.de/?postid=75

Durante o teste você pode executar com um 'debugger' como ADPlus anexa , que pode ser configurado de várias maneiras úteis de dados collect (minidespejos) sobre os erros e ainda evitar os problemas de diálogo modais você indicar acima.

Se você quiser obter alguma informação útil quando o seu aplicativo trava na produção Você pode configurar Microsoft relatórios de erro para obter algo semelhante aos dados ADPlus.

Esta não é uma resposta direta à pergunta uma vez que esta é uma solução ea questão é sobre como desativar esse recurso, mas no meu caso, eu sou um usuário em um servidor com permissões limitadas e não pode desativar o recurso usando uma das outras respostas. Então, eu precisava de uma solução alternativa. Isso provavelmente irá trabalhar por pelo menos alguns outros que acabam sobre esta questão.

autohotkey portátil e criado uma macro que uma vez por minuto verifica se a caixa de pop-up existe, e se isso acontecer, clica no botão para fechar o programa. No meu caso, isso é suficiente, e deixa o recurso por outros usuários. Ela exige que eu iniciar o script quando eu executar o programa em risco, mas funciona para minhas necessidades.

O roteiro é 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ápido. Quando outras coisas estão em alta, este parece tentar ativar controles na janela de primeiro plano - que é suposto enviá-lo para o programa em segundo plano. Se eu encontrar uma solução, eu vou editar esta resposta para refletir isso, mas por agora, ser cauteloso sobre como usar este e tentar fazer outro trabalho em uma máquina ao mesmo tempo.

Depois de tentar tudo na internet para se livrar de apenas em depurador tempo, eu encontrei uma maneira simples que realmente funcionou e espero que vai ajudar alguém.

Vá para Painel de Controle Vá em Ferramentas Administrativas Ir para Serviços Olhe para baixo na lista para Machine Debug Manager Clique direito sobre ele e clique em Propriedades Na guia Geral, procure Start Up Tipo Clique em Desativar. Clique em Aplicar e em OK.

Eu não vi a mensagem depurador desde então, e meu computador está funcionando perfeitamente.

Em vez de alterar os valores no registro você pode completamente desativar o relatório de erro no Windows Server 2008 R2, Windows Server 2012 e Windows 8 com: serverWerOptin /disable

https://technet.microsoft. com / en-us / library / hh875648 (v = ws.11) .aspx

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top