Domanda

Non posso pubblicare il codice (problemi proprietari) ma qualcuno sa quali tipi di cose potrebbero causare il seguente errore in C#.Viene lanciato da un client VOIP che ho scritto (utilizzando l'API counterpath) quando la chiamata viene terminata dall'altro client.L'errore è:

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: 

AGGIORNAMENTO:
Si scopre che una delle librerie che stavamo utilizzando stava inviando un evento di cui non eravamo a conoscenza e il problema era lì da qualche parte.Risolto ora.

È stato utile?

Soluzione

Elenco di alcune possibilità:

  • Un oggetto viene utilizzato dopo essere stato smaltito.Questo può succedere spesso se stai eliminando l'oggetto gestito in un finalizzatore (non dovresti farlo).
  • Un'implementazione non gestita di uno degli oggetti in uso presenta bug e ha danneggiato l'heap della memoria del processo.Succede molto con DirectX, GDI e altri.
  • Il mashaling sul confine gestito-non gestito è difettoso.Assicurati di aggiungere un puntatore gestito prima di usarlo su una parte di codice non gestita.
  • Stai utilizzando un blocco non sicuro e stai facendo cose divertenti con esso.

Nel tuo caso potrebbe essere un problema con Windows Forms.Ma il problema non è che ciò accada, bensì che non viene riportato correttamente;forse hai ancora fatto qualcosa di sbagliato.

Sei in grado di determinare quale controllo sta causando l'errore utilizzando l'HWND?È sempre lo stesso?Questo controllo sta facendo qualcosa di divertente subito prima che l'applicazione si blocchi?La parte non gestita del controllo è una finestra personalizzata o un controllo standard?

Altri suggerimenti

Questo tipo di problema può verificarsi se si chiama codice non gestito, ad es.una dll.Può verificarsi quando il Marshalling va terribilmente storto.

Puoi dirci se stai chiamando codice non gestito?Se è così, stai utilizzando il Marshalling predefinito o cose più specifiche?Dall'aspetto dell'analisi dello stack stai utilizzando codice non sicuro, ad es.Puntatori e simili?Questo potrebbe essere il tuo problema.

Ecco uno stacktrace più dettagliato.Mi sembra che abbia qualcosa a che fare con System.Windows.Form.dll

il TargetSite è elencato come {IntPtr DispatchMessageW(MSG ByRef)}
e sotto il modulo ha System.windows.forms.dll

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top