C # Corrupt Memory Error

Я не могу опубликовать код (проприетарные проблемы), но кто-нибудь знает, какие типы вещей могут вызвать следующую ошибку в C #. Он генерируется VOIP-клиентом, который я написал (используя counterpath api), когда вызов завершается другим клиентом. Ошибка:

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: 

ОБНОВЛЕНИЕ:
Оказывается, одна из библиотек, которую мы использовали, отправляла событие, о котором мы не знали, и проблема была где-то там. Исправлено сейчас.

20.08.2008 13:28:57
3 ОТВЕТА
РЕШЕНИЕ

Список некоторых возможностей:

  • Объект используется после его утилизации. Это может случиться много, если вы размещаете управляемый объект в финализаторе (вы не должны этого делать).
  • Неуправляемая реализация одного из используемых вами объектов содержит ошибки, и это повредило кучу памяти процесса. Многое происходит с DirectX, GDI и другими.
  • Машалинг на управляемой неуправляемой границе имеет недостатки. Убедитесь, что вы прикрепили управляемый указатель, прежде чем использовать его в неуправляемой части кода.
  • Вы используете небезопасный блок и делаете с ним забавные вещи.

В вашем случае это может быть проблема с Windows Forms. Но проблема не в том, что это происходит, а в том, что об этом не сообщают правильно; Вы, возможно, все еще сделали что-то не так.

Вы можете определить, какой элемент управления вызывает ошибку, используя HWND? Это всегда то же самое? Этот элемент управления делает что-то смешное перед тем, как приложение падает? Является ли неуправляемая часть элемента управления пользовательским окном или стандартным элементом управления?

3
20.08.2008 13:51:21

Такая проблема может возникнуть, если вы вызываете неуправляемый код, например, dll. Это может произойти, когда Marshalling идет ужасно неправильно.

Можете ли вы сказать нам, если вы вызываете неуправляемый код? Если да, то используете ли вы по умолчанию Marshalling или более конкретные вещи? По внешнему виду трассировки стека вы используете небезопасный код, например указатели и тому подобное? Это может быть вашей проблемой.

1
20.08.2008 13:30:30

Вот более подробная трассировка стека. Мне кажется, это как-то связано с System.Windows.Form.dll

TargetSite указан как {IntPtr DispatchMessageW(MSG ByRef)}
и под модулем он имеет System.windows.forms.dll

0
20.08.2008 13:46:56