2010-08-20 9 views
1

En arrière-plan, cette application est une application d'impression qui s'exécute dans REvit Structure, un programme Autodesk. C'est un add-in .net.conseils sur le débogage tentative de lecture ou d'écriture d'exception de mémoire protégée avec winforms

J'ai été en proie à ce genre d'exceptions qui apparaissent par intermittence et c'est vraiment frustrant. Comment puis-je faire pour les déboguer?

Généralement, il est conseillé de ne pas utiliser le multithreading dans les compléments Revit, et tout ce que je fais dans ce cas particulier est de lire des informations de Revit puis d'afficher une boîte de dialogue s'il manque des informations. Je ne sais pas pourquoi cela provoque 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) 

Ainsi, au bouton, vous pouvez voir ma méthode FilePostProicessor.SetParameters est où le messagebox est ressuscité. Mais quand cela arrive, un tas d'autres choses se passe avec Raising Events (une partie du code des formulaires Windows?) Et puis il y a des choses Autodesk en haut que je ne connais pas.

De plus, j'ai remarqué que 'ExceptionWrapper.InternalRealCall' est-ce que cela m'aide du tout, y a-t-il une exception réelle quelque part que je puisse voir qui soit à moitié utile pour moi?

Y at-il quelque chose que je fais mal ici? Mon code est juste un seul thread en boucle à travers certaines choses.

Je me rends compte que ce n'est pas beaucoup d'informations pour vous les gars de dire «boom line 358 est votre problème», mais tout conseil sur le débogage/éviter ces types d'erreurs serait utile. Je ne fais rien de non géré bien que j'utilise dsofile.dll pour définir certaines propriétés personnalisées sur un fichier, mais c'est quelques lignes de code au-dessus de ce que je fais et je pense que son thread unique?

+0

Je suis confronté au même problème. avez-vous trouvé comment le réparer? – alital

Répondre

1

Je pense que vous pourriez voir un problème de ré-entrée ici. La boîte de dialogue pompe les messages Windows qui, dans ce cas, sont rappelés dans Autodesk. Autodesk ne s'attend peut-être pas à être rappelé - il peut être dans un mauvais état.

Vous pourriez essayer de créer un nouveau thread pour la boîte de dialogue pour exécuter dans.

1

Je ne suis pas familier avec Revit, mais dans AutoCAD si vous créez des objets de dessin temporaires, vous devez soit les ajouter au dessin ou appelez explicitement .Dispose sur l'objet. Quelque chose sur la façon dont le garbage collector .NET s'exécute automatiquement sur un autre thread et les destructeurs AutoCAD ne sont pas thread-safe. Ainsi, tous les objets AutoCAD orphelins nettoyés par le collecteur .NET garbase provoquent l'échec du programme. Ce n'est peut-être pas votre problème mais c'est quelque chose à vérifier de toute façon.

Sinon, j'ai également lu que cette erreur peut être provoquée par des appels de fonction mal formés dans du code non géré qui, comme l'erreur le suggère, engendre la mémoire du programme. Il n'y a peut-être pas grand chose à faire à ce sujet. Donc la partie la plus délicate de l'erreur est que la cause aurait pu se dérouler il y a longtemps et l'endroit où l'exception est lancée est juste une victime innocente et ne vous donne aucune idée de la fonction appelez le dommage original.

J'ai aussi lu que la désactivation des optimisations du compilateur et l'inclusion d'informations de débogage dans la construction peuvent masquer le problème. Quelque chose à propos de la façon dont les informations de débogage sont incluses dans la construction, la corruption de la mémoire va simplement surcharger les méta-données de débogage au lieu des données du programme, ne réparant donc pas l'erreur qui l'empêche de faire des dégâts.