Pergunta

Este é o dia do estranho comportamento.

Temos um projeto Win32 feita com Delphi 2007, que hospeda a .Tempo de execução NET e chama .NET para mostrar novas formas, como parte de um período de transição.

Recentemente começamos a experimentar exceções em locais aparentemente aleatórios e pontos de nosso código:Aritmética de overflow ou underflow.

O rastreamento de pilha de um destes se parece com isso:

at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.RunDialog(Form form)
at System.Windows.Forms.Form.ShowDialog(IWin32Window owner)
at System.Windows.Forms.Form.ShowDialog()
at Gatsoft.Gat.UI.Windows.Forms.Remanaging.RemanageForm.DelphiOpenInNewMode(String employeeCode, String departmentCode, DateTime date) in C:\Dev\VS.NET\Gatsoft\Gatsoft.Gat.UI.Windows\Forms\Remanaging\RemanageForm.Delphi.cs:line 67

No Visual Studio solution, um dos melhor bibliotecas de classe (ie.recebe todas as referências a ele pode), tem de definir uma específicas de depuração do programa, voltado para o Delphi project saída.Isto permite-nos de depuração .LÍQUIDO de código do Visual Studio, mesmo que o volume principal do programa é escrito em Delphi.

O problema só ocorre quando executar a partir do depurador, não se nós apenas executar o arquivo exe diretamente (ou através do explorador, atalhos, ou até mesmo Ctrl+F5 dentro do Visual Studio).

Há, aparentemente, nenhum spyware na máquina (como sugerido por este).

Quaisquer outras coisas que podemos verificar?


Editar: Parece que o .NET depurador está permitindo que este SNaN bandeiras, e o Delphi depurador não.Nós vamos ter que investigar isso melhor, mas por agora vou aceitar @Lorenzo Boccaccia's respostas.

Aparentemente Resolvido

Ok, parece que, finalmente, pregado este problema.O problema começou ocorrendo sem ter o depurador anexado, bem como, para os nossos testadores, então tivemos que priorizar o problema do caminho.

Finalmente encontramos um problema comum com as máquinas que tinham o problema, eles são Dell Lattitude D620 laptops com placas de vídeo NVIDIA Quadro NVS 110M, com um driver antigo a partir de uma imagem do sistema utilizado para a prestação dos laptops, a partir de trás, em 2006.

Eu achei um post na web, apesar de eu perdi a url quando eu reiniciei para atualizar o driver de vídeo, que tinha um .NET serviço de cair, principalmente quando a máquina estava ocupado fazendo algo na tela.Uma maneira de reproduzir o seu problema era para abrir um prompt de comando para C:\ e fazendo um DIR /S apenas a força de uma enorme quantidade de atualizações de tela, o que provocaria o acidente.

Ele também tinha uma placa de vídeo NVIDIA.

O problema na minha máquina ocorreu aproximadamente a cada 2-4 startups do nosso programa, mas depois de atualizar o driver de vídeo que eu já tinha 123 sucesso de startups, sem quaisquer problemas.(BTW, eu recomendo O AutoHotKey para tais coisas).

Portanto, parece que temos encontrado o culpado, um velho/buggy driver da NVIDIA.

Atualizado esta questão, de modo que, talvez, alguém, no futuro, pode poupar algum tempo.

Agora, se você vai me desculpar, eu estou indo para ir chorar em um canto.

Jinxed!

Eu devia jinxed-lo.Mal tinha eu postei acima de atualização de um colega laptop não, depois de atualizar o driver de vídeo.

Ainda assim, estou certo de que ele é um problema fora da nossa aplicação, agora, então, ele permanece apenas para descobrir que coisas específicas para atualização.


Mais atualizações:Ok, a minha máquina é agora, aparentemente fixo, não é assim com os meus colegas da máquina.Até agora, nós atualizamos a BIOS, drivers de Chipset, e atualmente o SP3 para o XP está em seu caminho.

Um teste de burn-in será feito hoje a noite, onde o aplicativo será deixada durante a noite, começando, como o problema surgiu durante a inicialização, ou na primeira vez, algumas WinForms .NET código foi executado.Este aplicativo é, principalmente, um Delphi Win32 aplicativo, mas hosts .Tempo de execução NET, e o problema parece estar relacionado .LÍQUIDO código.Quando nós "boot" da .Tempo de execução NET, o problema pode aparecer, ou quando lançamos o primeiro .NET janela do Win32, então ele também pode aparecer.


Estatisticamente eu estou pronto para liberar este código agora.Sobre a noite em que o aplicativo foi iniciado 3051 vezes, sem erros, enquanto que antes eu atualizei o driver de vídeo travou a cada 2-4 vezes.

Cutucou e encontrado(!/?)

Este erro de fixação de provação sente como ir ao médico, onde a seguinte conversa segue:

Doc: Does this hurt?
Me: No...
Doc: What about now?

Eu já cutucou e enfiei a aplicação e, finalmente acho que encontrei algo que fez, que introduziu este problema.

Na nossa aplicação vamos hospedar o .Tempo de execução NET, a partir de um Delphi 2007 aplicação de Win32, e na nossa cola-código, temos a seguinte linha (agora):

  rc := CorBindToRuntimeEx('v2.0.50727', 'wks',
  STARTUP_LOADER_OPTIMIZATION_MULTI_DOMAIN or STARTUP_CONCURRENT_GC,
  @clsid, @iid, UnkRuntimeEngine);

As duas constantes ali no meio era originalmente apenas um 0, o que significa escolha as predefinições.Esta alteração foi introduzida há alguns meses e o problema foi rastejando lentamente nos a nós depois.A alteração foi introduzida a fim de incentivar FORMIGAS profiler para carregar nosso aplicativo Win32 + hospedado .Tempo de execução NET para fazer perfis de desempenho e as alterações introduzidas volta, em seguida, fez esse trabalho.Além disso, o problema de aritmética de overflow/underflow, aos poucos, foi ficando cada vez pior, então eu aposto que o problema não aparecer por um tempo após a alteração, portanto, não foi atribuída a qualquer uma das mudanças que fizemos.

Também, já que só (originalmente) viu o problema ao executar através do depurador, nós pensamos que algo estava errado com o Visual Studio e/ou Delphi.

De qualquer maneira, estatisticamente agora, com um navegador em uma única tela, fazendo repetida de rolagem para cima e para baixo acionado por um javascript (aparentemente necessário para acionar o erro), então eu tenho sido capaz de iniciar com êxito o aplicativo 726 vezes com um 0 na chamada, e ele cai de 5 de 17 vezes com as duas constantes de lá.

Doc: Does this hurt?

E não vamos entrar quem fez essa alteração, em primeiro lugar.Estou certo de que o culpado quer ser deixado anônimo... tosse

Foi útil?

Solução

uma versão de depuração de uma dll pode ser compilado com sinalização nan suporte, consulte http://blogs.msdn.com/oldnewthing/archive/2008/07/02/8679191.aspx para obter um exemplo desse problema.

que heisenbug foi causado por variáveis não inicializadas, aqui não poderia ser uma dll vinculado permitindo a snan recurso da cpu, esquecendo-se de desabilitá-lo ao voltar

Outras dicas

Os erros ocorrem ainda ocorrer se você anexar o depurador depois de iniciar a aplicação?

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