Pergunta

Não consigo postar o código (problemas proprietários), mas alguém sabe que tipos de coisas causariam o seguinte erro em C#.Ele está sendo lançado por um cliente VOIP que escrevi (usando a API counterpath) quando a chamada é encerrada pelo outro cliente.O erro é:

System.AccessViolationException was unhandled
  Message="Attempted to read or write protected memory. This is often an indication that other memory is corrupt."
  Source="System.Windows.Forms"
  StackTrace:
       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(Form mainForm)
       at CollabAnalysisSF.Edge.GUI.Forms.Program.Main() in d:\data\beyerss\Desktop\client\GUI\ARGui\Program.cs:line 18
       at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
       at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()
  InnerException: 

ATUALIZAR:
Acontece que uma das bibliotecas que estávamos usando estava enviando um evento que não conhecíamos e o problema estava em algum lugar.Corrigido agora.

Foi útil?

Solução

Lista de algumas possibilidades:

  • Um objeto está sendo usado depois de ter sido descartado.Isso pode acontecer muito se você estiver descartando objetos gerenciados em um finalizador (você não deve fazer isso).
  • Uma implementação não gerenciada de um dos objetos que você está usando está com erros e corrompeu a pilha de memória do processo.Acontece muito com DirectX, GDI e outros.
  • Mashaling no limite gerenciado-não gerenciado é falho.Certifique-se de fixar um ponteiro gerenciado antes de usá-lo em uma parte não gerenciada do código.
  • Você está usando um bloco inseguro e fazendo coisas engraçadas com ele.

No seu caso, pode ser um problema com o Windows Forms.Mas o problema não é que isso esteja acontecendo, mas sim que não está sendo relatado corretamente;você possivelmente ainda fez algo errado.

Você consegue determinar qual controle está causando o erro usando o HWND?É sempre o mesmo?Este controle está fazendo algo engraçado pouco antes de o aplicativo travar?A parte não gerenciada do controle é uma janela personalizada ou um controle padrão?

Outras dicas

Esse tipo de problema pode ocorrer se você estiver chamando código não gerenciado, por exemplo.uma dll.Pode ocorrer quando o Marshalling dá terrivelmente errado.

Você pode nos dizer se está chamando código não gerenciado?Em caso afirmativo, você está usando Marshalling padrão ou algo mais específico?Pela aparência do rastreamento de pilha, você está usando código inseguro, por exemplo.Ponteiros e afins?Este pode ser o seu problema.

Aqui está um stacktrace mais detalhado.Parece-me que tem algo a ver com System.Windows.Form.dll

o TargetSite está listado como {IntPtr DispatchMessageW(MSG ByRef)}
e no módulo tem System.windows.forms.dll

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