Pergunta

Eu tenho um processo que lida com as exceções grande.Ele chama:

_set_se_translator(exception_trans_func); 
SetUnhandledExceptionFilter(UnhandledExceptionFilterHandler);
_set_purecall_handler(purecallHandler);
set_terminate(terminateHandler);
set_unexpected(unexpectedHandler);
_set_invalid_parameter_handler(InvalidParameterHandler);
atexit(exitHandler); //ignored during an expected exit
_onexit(onexitHandler); //ignored during an expected exit

A qualquer momento uma exceção acontece, um dos manipuladores é chamado de que cria uma cópia de falha para mim.A vida é boa.

Excepto no site de um cliente.Quando eles encerramento do processo, não é uma exceção que não é roteado através dessas ligações, por algum motivo, e eles recebem a mensagem de erro:

A instrução no "0x101ba9df" consultou a memória em "0 x 00000004".A memória não pôde ser "lida".Clique em OK para terminar...."

A referência de memória de x000000004 olha como ele é, provavelmente, um ponteiro nulo.E olhando para o endereço aparece para ser um global STL processo de destruição do objecto (provavelmente na CRT initterm chamada onde globais são limpos).

Agora eu sou o tipo de preso que desde que eu não posso obter um despejo de diagnóstico e de pilha de chamada e ver exatamente o que está acontecendo.Então....

Por que não a exceção a ser encaminhada através acima manipuladores, e ao invés de ser mostrado para o usuário?

Existe alguma maneira de esconder que o diálogo (desde que nenhum dano que está sendo feito nesse momento)?

E existe uma maneira de rastrear a raiz do erro?

Obrigado por qualquer ideias.

Foi útil?

Solução

Que sistema operacional eles estão executando?

Suponho que você está definindo o modo de erro usando algo como

::SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX);

Para garantir que o Windows não esteja pulando com seu próprio manuseio de erros?

Outras dicas

Parece que o CRT colocou um bloco de tentativa/captura seh (não posso escrevê -lo corretamente, o markdown entra em ação) em torno de um pedaço de código e está pegando a exceção para exibir a mensagem, para que você nunca acabe chamando o não atendido Path de código de exceção. Você pode ter que fazer alguns hackers do CRT para descobrir o que está acontecendo.

Pode ser que STL código está sendo executado durante a destruição de variáveis globais em programa de desligamento tempo e, talvez (dependendo da versão do STL que você estiver usando) algumas variáveis globais que requer já foram destruídos.

Eu tenho visto isso com o VS2008 da STL.Há alguns STL bloqueio de objetos que são criados através de um arquivo de nível estático durante a partida.

Você está usando STL em seu manipulador de erro de funções?Pode ser que uma delas vai fora da final em programa de desligamento e a causar o problema.

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