C # Поврежденная ошибка памяти - PullRequest
2 голосов
/ 20 августа 2008

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

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: 

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

Ответы [ 3 ]

3 голосов
/ 20 августа 2008

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

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

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

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

1 голос
/ 20 августа 2008

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

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

0 голосов
/ 20 августа 2008

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

Целевой сайт указан как {IntPtr DispatchMessageW(MSG ByRef)}
и под модулем у него есть System.windows.forms.dll

...