exceção sem rastreamento de pilha - como?

Temos um serviço que registrará exceções não tratadas no nível do domínio do aplicativo (via Log4net).

Registramos:

2014-01-28 16: 49: 19,636 ERRO [49] FeedWrapperService - System.NullReferenceException não tratado: Referência de objeto não definida para uma instância de um objeto.

Esta exceção não possui rastreamento de pilha. Como isso é possível sem fazer algumas coisas malucas ao objeto de exceção?

Nosso código de manuseio:

AppDomain.CurrentDomain.UnhandledException += LogAnyExceptions;

private void LogAnyExceptions(object sender, UnhandledExceptionEventArgs e)
{
    log.Error("unhandled", (Exception)e.ExceptionObject);
    throw (Exception)e.ExceptionObject;
}

Ocorre-me que o relance aqui é inútil, porque o AppDomain será desativado juntamente com o processo, mas acho que isso não afeta nossa situação.

O visualizador de eventos do aplicativo windows também mostra apenas essa exceção de referência nula e nenhum rastreamento.

Testei o log do manipulador de exceções e ele registra com êxito o rastreamento de pilha e qualquer exceção interna. Se fosse lançado pelo nosso código, veríamos um rastreamento de pilha. Se ele fosse lançado pela biblioteca c # de terceiros, novamente, veríamos um rastreamento de pilha de pelo menos um método (se era uma exceção lançada novamente ou não). Aqui vemos uma exceção gerenciada sem rastreamento de pilha. Não sei como isso é possível.

Observando a biblioteca de terceiros descompilada, ela fala com código não gerenciado, e o evento que gerou essa exceção provavelmente ocorre em terras não gerenciadas, mas como essa situação poderia causar uma exceção de ref nula gerenciada sem um rastreamento de pilha?

A causa desse problema é intermitente. Estamos executando esse código em produção há vários meses e o vimos fazer isso uma vez. É bem esquisito.

O consenso geral é que o sistema responsável por esse tipo de problema deve ser transferido para um processo filho, para que possamos lidar com o problema e reiniciar com segurança e automaticamente, mas seria bom saber o que está acontecendo.

Edite para incluir as informações dos comentários abaixo:

Minha exceção não é um re-lançamento padrão, porque o rastreamento de pilha é nulo ou vazio. Não possui o nome do método de re-lançamento. Indo além, a classe Exception pode ser construída a partir de informações serializadas e parece que as informações serializadas podem conter seqüências nulas para rastreamento de pilha e potencialmente que podem ser criadas sem causar outros erros. Acho que pode vir daí, mas não sei como se originou.

questionAnswers(2)

yourAnswerToTheQuestion