советы по отладке попытки чтения или записи защищенной памяти с помощью winforms - PullRequest
1 голос
/ 20 августа 2010

В некотором роде это приложение для печати, которое работает в REvit Structure, программе Autodesk. Это надстройка .net.

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

Обычно рекомендуется, чтобы многопоточность не использовалась в надстройках Revit, и все, что я делаю в этом конкретном случае, - это чтение некоторой информации из Revit и затем отображение диалогового окна, если какая-то информация отсутствует. Я не знаю, почему это вызывает AccessVioldationExceptions

Unhandled exception!: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.; StackTrace:    at CCmdUI.DoUpdate(CCmdUI* , CCmdTarget* , Int32 )
   at CTestCmdUI.computeEnabled(CTestCmdUI* , CCmdTarget* pTarget)
   at UIFrameworkServices.CommandHandlerService.canExecute(String strName)
   at UIFramework.CommandUtility.CanExecute(RibbonCommandItem btn)
   at UIFramework.RibbonGlobalHandler.CanExecute(Object parameter)
   at Autodesk.Windows.InternalCommands.CanExecuteGenericCommand(Object sender, CanExecuteRoutedEventArgs args)
   at System.Windows.Input.CommandBinding.OnCanExecute(Object sender, CanExecuteRoutedEventArgs e)
   at System.Windows.Input.CommandManager.FindCommandBinding(CommandBindingCollection commandBindings, Object sender, RoutedEventArgs e, ICommand command, Boolean execute)
   at System.Windows.Input.CommandManager.FindCommandBinding(Object sender, RoutedEventArgs e, ICommand command, Boolean execute)
   at System.Windows.Input.CommandManager.OnCanExecute(Object sender, CanExecuteRoutedEventArgs 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.RaiseEvent(RoutedEventArgs args, Boolean trusted)
   at System.Windows.Input.RoutedCommand.CanExecuteImpl(Object parameter, IInputElement target, Boolean trusted, Boolean& continueRouting)
   at System.Windows.Input.RoutedCommand.CanExecute(Object parameter, IInputElement target)
   at MS.Internal.Commands.CommandHelpers.CanExecuteCommandSource(ICommandSource commandSource)
   at System.Windows.Controls.Primitives.ButtonBase.UpdateCanExecute()
   at System.Windows.Input.CommandManager.CallWeakReferenceHandlers(List`1 handlers)
   at System.Windows.Input.CommandManager.RaiseRequerySuggested(Object obj)
   at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Boolean isSingleParameter)
   at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Boolean isSingleParameter, Delegate catchHandler)
   at System.Windows.Threading.DispatcherOperation.InvokeImpl()
   at System.Threading.ExecutionContext.runTryCode(Object userData)
   at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Windows.Threading.DispatcherOperation.Invoke()
   at System.Windows.Threading.Dispatcher.ProcessQueue()
   at System.Windows.Threading.Dispatcher.WndProcHook(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, Boolean isSingleParameter)
   at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Boolean isSingleParameter, Delegate catchHandler)
   at System.Windows.Threading.Dispatcher.InvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Boolean isSingleParameter)
   at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
   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.Form.ShowDialog(IWin32Window owner)
   at BWTools.ErrorDisplayer.DisplayErrorWithoutLogging(String message) in C:\devel\Revit Macros\2011\BWTools\ErrorDisplayer.cs:line 93
   at Plotting.Printers.FilePostProcessor.SetParameters(IDictionary`2 sheetLocations, ParameterGrabber grabber, FilePrintSettings settings) in C:\devel\Revit Macros\2011\PLT2\Plotting\Printers\FilePostProcessor.cs:line 277
   at Plotting.Printers.FilePostProcessor.ProcessSheets(IList`1 sheets, String extension, String finalLocation, ParameterGrabber grabber, FilePrintSettings settings) in C:\devel\Revit Macros\2011\PLT2\Plotting\Printers\FilePostProcessor.cs:line 37
   at Plotting.Printers.PdfPrinter.Print(PrintSelection selection, FilePrintSettings settings) in C:\devel\Revit Macros\2011\PLT2\Plotting\Printers\PdfPrinter.cs:line 68
   at Plotting.Printers.PdfPrinter.Print(PrintSelection selections, PrintSettings settings) in C:\devel\Revit Macros\2011\PLT2\Plotting\Printers\PdfPrinter.cs:line 112
   at Plotting.GuiControl.Print() in C:\devel\Revit Macros\2011\PLT2\Plotting\Gui\GuiControl.cs:line 148
   at Plotting.Gui.PrintingSplash.animationTimer_Tick(Object sender, EventArgs e) in C:\devel\Revit Macros\2011\PLT2\Plotting\Gui\PrintingSplash.xaml.cs:line 51
   at System.Windows.Forms.Timer.OnTick(EventArgs e)
   at System.Windows.Forms.Timer.TimerNativeWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

Таким образом, на кнопке вы можете увидеть мой метод FilePostProicSE. SetParameters - это то, откуда выводится окно сообщения. Но когда это происходит, куча других вещей, связанных с Raising Events (часть окон формирует код?), А затем в верхней части есть кое-что из Autodesk, о котором я не знаю.

Также я заметил, что 'ExceptionWrapper.InternalRealCall' мне это вообще помогает, есть ли где-то реальное исключение, которое, как я вижу, наполовину полезно для меня?

Я что-то здесь не так делаю? Мой код - просто однопоточный цикл с некоторыми вещами.

Я понимаю, что вам, ребята, не так много информации, чтобы сказать: «Стрела 358 - это ваша проблема», но любой совет по устранению / устранению ошибок такого типа был бы полезен. Я не делаю ничего неуправляемого, хотя я использую dsofile.dll для установки некоторых пользовательских свойств файла, но это на несколько строк кода выше того, что я делаю, и я думаю, что он однопоточный?

Ответы [ 2 ]

1 голос
/ 10 декабря 2010

Я не знаком с Revit, но в AutoCAD, если вы создаете временные объекты чертежа, вы должны либо добавить их к чертежу, либо явно вызвать .Dispose для объекта.Кое-что о том, как сборщик мусора .NET автоматически запускается в другом потоке, а деструкторы AutoCAD не являются поточно-ориентированными.Поэтому любые потерянные объекты AutoCAD, которые очищаются сборщиком garbase .NET, приводят к сбою программы.Возможно, это не ваша проблема, но ее все равно нужно проверить.

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

Я также читал, что отключение оптимизации компилятора и включение отладочной информации в сборку может замаскировать проблему.Кое-что о том, как, когда отладочная информация включена в сборку, повреждение памяти будет просто перезаписывать отладочные метаданные вместо программных данных, таким образом, не исправляя ошибку, а просто предотвращая ее повреждение.

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

Я думаю, вы можете увидеть здесь проблему с повторным входом.Диалог перекачивает сообщения Windows, которые в этом случае перезванивают в Autodesk.Возможно, Autodesk не ожидает повторного вызова - возможно, он находится в плохом состоянии.

Вы можете попытаться создать новый поток для запуска диалога.

...