Pergunta

Lamento se o post é muito longo, mas eu ficaria feliz se alguém teria pelo menos apontar ler os títulos em negrito, e me aponte na direção certa. Estou tendo este problema para alguns dias, mas foi incapaz de encontrei a resposta na rede. Estas são as coisas que tenho encontrado até agora.

1. "Violação de acesso" exceção esmaga meu aplicativo gerenciado

Meu C # WinForms app, por vezes, termina com uma exceção "Violação de acesso" ( "Tentativa de ler ou memória protegida write"), bem no momento em que a seleção de um TabPage em um windows formar TabControl. A partir do rastreamento de pilha (try / catch em torno Application.Run) Eu posso ver que a exceção acontece no System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg), chamado dentro UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData).

-- Message: Attempted to read or write protected memory.
   This is often an indication that other memory is corrupt.
-- Stack trace:
   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.Run(ApplicationContext context)
   at MyApp.Program.Main()

2. O módulo com falha parece ser um objeto COM (ChartFX Cliente Server 6.2)

Usando o WinDbg (com SoS carregado), eu peguei-o no lado não gerenciado, dentro ChartFX.ClientServer.Core.dll (que é um componente de gráficos COM estamos usando):

(ca84.c98c): Access violation - code c0000005 (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
eax=00000000 ebx=06e67c38 ecx=06e67c38 edx=000018c6 esi=06e7df30 edi=317a9e80
eip=31666110 esp=0015e040 ebp=0015e08c iopl=0         nv up ei pl zr na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00010246
ChartFX_ClientServer_Core!Ordinal5507+0x97b7:
31666110 8a404d          mov     al,byte ptr [eax+4Dh]      ds:0023:0000004d=??

[editar:] Eu também não foi capaz de obter os detalhes pilha unmamanged de WinDbg (ele disse "Pilha informações descontrair não disponível"):

0:000> kP
ChildEBP RetAddr  
WARNING: Stack unwind information not available. Following frames may be wrong.
0015e08c 3166288b ChartFX_ClientServer_Core!Ordinal5507+0x97b7
0015e394 3165a921 ChartFX_ClientServer_Core!Ordinal5507+0x5f32
0015e480 31678685 ChartFX_ClientServer_Core!Ordinal5496+0x26a
0015e568 3167bef4 ChartFX_ClientServer_Core!Ordinal5492+0x975
0015e668 316a356b ChartFX_ClientServer_Core!Ordinal5492+0x41e4
0015e77c 31709496 ChartFX_ClientServer_Core!Ordinal443+0x5745
0015e7d0 31707f70 ChartFX_ClientServer_Core!Ordinal2584+0x3cdc
0015e7f8 3170817d ChartFX_ClientServer_Core!Ordinal2584+0x27b6
0015e81c 3162fd76 ChartFX_ClientServer_Core!Ordinal2584+0x29c3
0015e86c 7719f8d2 ChartFX_ClientServer_Core!Ordinal899+0x6b6
0015e898 7719f794 USER32!GetMessageW+0x93
0015e910 771a06f6 USER32!GetWindowLongW+0x115
0015e940 771a069c USER32!CallWindowProcW+0x75
0015e960 747fcef4 USER32!CallWindowProcW+0x1b
0015e97c 747fd073 comctl32!Ordinal377+0x5c
0015e9e0 747fd027 comctl32!DefSubclassProc+0x92
0015ea04 747fd4e6 comctl32!DefSubclassProc+0x46
0015ea20 747fd073 comctl32!DefSubclassProc+0x505
0015ea84 747fd118 comctl32!DefSubclassProc+0x92
0015eae4 7719f8d2 comctl32!DefSubclassProc+0x137

3. Bug não é fácil de reproduzir (embora possa ser provocado geralmente em menos de 5 min.)

Eu tenho vários casos Gráfico em vários TabPages, e isso geralmente acontece quando eu estou passando as guias. Eu ainda não sei como reproduzi-lo, além de mudar essas guias durante vários minutos antes que aconteça, então não posso usar o nosso controle de origem para encontrar de forma confiável a construção que não tem esse problema. Eu estou acessando as tabelas através do AxChart conseguiu invólucro de classe (derivada de AxHost), que foi criado pelo designer VS automaticamente.

4. Qual deve ser o meu próximo passo?

Se alguém pudesse me aponte para o próximo passo que devo fazer para encontrar a verdadeira causa, eu ficaria muito grato. Experimentando (remoção e retornando código) não faz muito bom, porque eu não sei como reproduzi-lo, de modo que seria necessário uma grande quantidade de tempo em cada iteração apenas para me convencer de que o bug ainda está lá.

Eu descobri que as pessoas muitas vezes sugerem algo como "comutação otimizações do compilador", mas desde que a exceção não é lançada de forma determinística, eu não quero simplesmente reorganizar alguns bytes e espero que ele nunca retorna.

Muito obrigado antecipadamente!

Com os melhores cumprimentos, Groo

Foi útil?

Solução

Ao adicionar lotes de vestígios de log todo o código, eu consegui notar que em alguns casos, uma das propriedades voltas do gráfico em Double.NaN. Depois que eu conseguir isso, app sempre caiu durante a próxima repaint Chart. Ao manipular eventos PrePaint e PostPaint do gráfico (felizmente ele tem esses eventos), eu confirmou que o acidente acontece certo entre estes dois eventos.

Em particular, isso só acontece se eu definir zoom do gráfico antes de ter sido pintado pela primeira vez (primeira vez desde a última atualização). Consegui fazê-lo de uma maneira diferente, e não caiu desde então.

Não estou muito satisfeito com esta "solução", uma vez que é obviamente algum problema interno que não pode ser detectada com precisão antes que ela realmente cai, e eu só pode ser escondê-lo desta forma. Mas eu tenho que deixá-lo como é para agora, porque eu estou perdendo muito tempo caso contrário.

[Update]

replicado o bug com sucesso

Eu fiz um aplicativo de teste rápido, onde eu definir as propriedades de alguma carta duas vezes, antes de ser realmente pintado, e aplicação cai imediatamente. Relatei o bug para Software FX, mas não obteve resposta. Este não é o primeiro bug irritante que eu estou tendo com este controle, mas para o nosso próximo lançamento Estamos comutação para sua versão gerenciada (Net), por isso vamos ter pelo menos refletor para descobrir como resolver esses erros.

De qualquer forma, graças a todos!

Outras dicas

Ele se parece muito com uma questão de segurança do thread.
Sugiro que você comece lendo a documentação do controle, procurando especificamente menção de thread-segurança. O modelo de segmento tipicamente usado pelos componentes COM é diferente - e muitas vezes incompatíveis -. Com (trivial) .NET uso

Tive uma delas um tempo atrás. Nosso caso em questão foi uma chamada de PInvoke: OpenPrinter (porta string);

O nosso problema foi que o código gerenciado enviou: "LPT1:" mas o código não gerenciado declarou um byte [1024] array e ler 1024 bytes em diante a partir do endereço da string. Isso iria ler fora dos limites da string alocada ( "LPT1:"). E ocasionalmente vaguear na memória que não foi alocado para a aplicação causando assim este AccessViolationException intermitente

fixo isso alterando a chamada para:. OpenPrinter (int comprimento, porta cadeia) de modo que o código não gerido poderia declarar uma matriz de bytes que era o comprimento correcto

Este post por ctacke também tem algumas guloseimas na tentativa de descobrir o que pode estar causando o problema.

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