Определение причины AccessViolationException DragDrop.DoDragDrop - PullRequest
11 голосов
/ 14 июня 2011

У меня есть приложение WPF, которое аварийно завершает работу на некоторых компьютерах с AccessViolationException при запуске операции перетаскивания.

Сложность заключается в том, что оно возникает только при сборках с нашего сервера сборки и никогда не происходит сбой при сборкелокально в Visual Studio 2010. Поэтому я не могу пошагово выполнить код.

У меня есть следующая информация:

  • Мы используем .net 4.0
  • Только сбойкогда приложение запускается как 64-битный процесс, 32-битный - это нормально.
  • Сбои только для сборок с сервера сборки.
  • Не происходит сбой на каждом компьютере, только на небольшом подмножестве ноутбуков.у нас здесьКоторые между прочим имеют одинаковую модель и аппаратную конфигурацию.У всех есть Windows 7, у некоторых - sp1, у некоторых - нет.

Какой следующий шаг я должен предпринять для диагностики этой проблемы?

Вот трассировка стека от сбояПохоже, что это происходит в неуправляемом коде:

at MS.Win32.UnsafeNativeMethods.DoDragDrop(IDataObject dataObject, IOleDropSource dropSource, Int32 allowedEffects, Int32[] finalEffect)
at System.Windows.OleServicesContext.OleDoDragDrop(IDataObject dataObject, IOleDropSource dropSource, Int32 allowedEffects, Int32[] finalEffect)
at System.Windows.DragDrop.OleDoDragDrop(DependencyObject dragSource, DataObject dataObject, DragDropEffects allowedEffects)
at Acquire.Common.UI.Behaviours.DragDropBehaviour.StartDrag(RoutedEventArgs e)
at Acquire.Common.UI.Behaviours.DragDropBehaviour.AttachedElementMouseMove(Object sender, MouseEventArgs e)
at System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)
at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
at System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)
at System.Windows.UIElement.RaiseTrustedEvent(RoutedEventArgs args)
at System.Windows.Input.InputManager.ProcessStagingArea()
at System.Windows.Input.InputProviderSite.ReportInput(InputReport inputReport)
at System.Windows.Interop.HwndMouseInputProvider.ReportInput(IntPtr hwnd, InputMode mode, Int32 timestamp, RawMouseActions actions, Int32 x, Int32 y, Int32 wheel)
at System.Windows.Interop.HwndMouseInputProvider.FilterMessage(IntPtr hwnd, WindowMessage msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
at System.Windows.Interop.HwndSource.InputFilterMessage(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)
at System.Windows.Threading.Dispatcher.WrappedInvoke(Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
at System.Windows.Threading.Dispatcher.InvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs)
at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
at MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg)
at System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame)
at System.Windows.Application.RunInternal(Window window)
at System.Windows.Application.Run()
at Acquire.Mica.Application.App.Main()

Обновление: Методом проб и ошибок я смог определить точную строку кода, которая вызвала этот сбой, и он появляетсябыть совершенно действительным.В качестве эксперимента я отключил оптимизацию кода для метода, содержащего ошибочную строку кода, и приложение больше не зависало.

Ответы [ 4 ]

1 голос
/ 12 сентября 2013

AV исключение наихудшее, вы должны знать, что проблема может быть вызвана совершенно другой частью системы.

Обычно происходит то, что вы случайно получаете доступ к области памяти, к которой у вас нет доступа, программа продолжает выполняться как обычно, однако позже другой метод пытается получить доступ к этой области памяти и вызывает ошибку, читая неверные данные место там по ошибке.

Для отладки я предлагаю вам воспользоваться gflags , инструментом, предлагаемым Microsoft для обнаружения ложных повреждений. Я использовал его несколько раз, и это сэкономило мне часы, если не дни отладки.

0 голосов
/ 25 января 2013

Прежде всего проверьте, все ли обновления установлены на машинах.

Позже вы можете использовать debugdiag для создания аварийного дампа и проверки исключений первого и второго шансов, чтобы получить больше информации по этому вопросу.

Привет,

Ian

0 голосов
/ 19 февраля 2013

Первое, что я хотел бы сделать, это обновить драйвер видеокарты этих ноутбуков.

в MS.Win32.UnsafeNativeMethods ..

Обычно это означает, что инженер MS .NET пытается сообщитьВы: «Эй, мы не написали это, и он разбился.»

0 голосов
/ 23 сентября 2012

Просто догадка, но поскольку вы указали, что оптимизируете код и используете смешанную 32/64-битную среду:

  1. Проверьте сервер сборки в 64-битной среде.
  2. Убедитесь, что на клиентах установлена ​​правильная версия .Net.
  3. Убедитесь, что на клиентах, на которых запущено приложение, установлена ​​правильная версия, т.е. 64-битная версия работает только в системах win7 x64 и наоборот.
  4. Убедитесь, что вы очистили временные каталоги серверов, предыдущие сборки временных каталогов могут вызывать такие странные проблемы, как этот.

Также обратите внимание, что разработчики Microsoft идиотичны в том, что они разделяют две среды, а ключи реестра / программные файлы и т. Д. Не хранятся там, где указывает программа. Это был серьезный камень преткновения, который мне пришлось преодолеть с помощью некоторых приложений, которые мы создали в моей компании.

Также я считаю, что вызовы буфера обмена и перетаскивания - это вызовы STA (однопоточные). Авария может быть из-за конфликта между STA и MTA. У вас есть функция Main (), украшенная [STAThread]?

Лично я нашел эту статью о 64-битной миграции полезной: http://www.codeguru.com/cpp/misc/samples/basicprogramming/article.php/c16093/Seven-Steps-of-Migrating-a-Program-to-a-64bit-System.htm

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...