gpt4 book ai didi

c# - 确定 AccessViolationException DragDrop.DoDragDrop 的原因

转载 作者:可可西里 更新时间:2023-11-01 08:49:55 24 4
gpt4 key购买 nike

我有一个 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()

更新:通过反复试验,我能够确定导致这次崩溃的确切代码行,而且它似乎是完全有效的。作为实验,我禁用了包含违规代码行的方法的代码优化,应用程序不再崩溃。

最佳答案

AV 异常是最糟糕的,您应该意识到问题可能源自系统中完全不同的部分。

通常发生的情况是您不小心访问了您无权访问的内存位置,程序继续照常执行,但是稍后另一种方法尝试访问该内存位置并通过读取不正确的数据导致错误放错地方了。

要进行调试,我建议您利用 gflags ,Microsoft 提供的一种检测 deap 损坏的工具。我用了好几次,它为我节省了数小时甚至数天的调试工作。

关于c# - 确定 AccessViolationException DragDrop.DoDragDrop 的原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6340764/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com