Нахождение источника UnhandledException - PullRequest
2 голосов
/ 08 февраля 2012

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

Исключение System.Reflection.TargetInvocationException выдается, когда я забиваю программу клиентскими связями и удерживаю клавишу ввода для записи спама вбаза данных.В какой-то момент возникает исключение, которое я ловлю с помощью следующего фрагмента кода в конструкторе главного окна:

    VMMainWindow()
    {
         ...
         System.Windows.Threading.Dispatcher.CurrentDispatcher.UnhandledException += new System.Windows.Threading.DispatcherUnhandledExceptionEventHandler(CurrentDispatcher_UnhandledException);
         ....
    }

    static void CurrentDispatcher_UnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
    {
        string str = e.ToString();
    }

Мне не над чем работать, но мне было интересноесли кто-то может предложить какие-либо инструменты или или указать мне правильное направление, чтобы помочь мне определить местонахождение этого исключения.Подробное исключение вставлено ниже.

System.Reflection.TargetInvocationException was unhandled   Message=Exception has been thrown by the target of an invocation.   Source=mscorlib   StackTrace:
       at System.RuntimeMethodHandle._InvokeMethodFast(IRuntimeMethodInfo method, Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeType typeOwner)
       at System.RuntimeMethodHandle.InvokeMethodFast(IRuntimeMethodInfo method, Object target, Object[] arguments, Signature sig, MethodAttributes methodAttributes, RuntimeType typeOwner)
       at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks)
       at System.Delegate.DynamicInvokeImpl(Object[] args)
       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.DispatcherOperation.InvokeImpl()
       at System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext(Object state)
       at System.Threading.ExecutionContext.runTryCode(Object userData)
       at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData)
       at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
       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, Int32 numArgs)
       at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, 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.Threading.Dispatcher.PushFrame(DispatcherFrame frame)
       at System.Windows.Threading.Dispatcher.Run()
       at System.Windows.Application.RunDispatcher(Object ignore)
       at System.Windows.Application.RunInternal(Window window)
       at System.Windows.Application.Run(Window window)
       at System.Windows.Application.Run()
       at SupernovaServer.App.Main() in D:\Projects\Supernova Server\Server\obj\x86\Debug\App.g.cs:line 0
       at System.AppDomain._nExecuteAssembly(RuntimeAssembly 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, Boolean ignoreSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()   InnerException: System.ArgumentOutOfRangeException
       Message=Index was out of range. Must be non-negative and less than the size of the collection. Parameter name: index
       Source=mscorlib
       ParamName=index
       StackTrace:
            at System.ThrowHelper.ThrowArgumentOutOfRangeException()
            at System.Collections.Generic.List`1.get_Item(Int32 index)
            at System.Collections.ObjectModel.Collection`1.System.Collections.IList.get_Item(Int32 index)
            at System.Windows.Data.ListCollectionView.AdjustBefore(NotifyCollectionChangedAction action, Object item, Int32 index)
            at System.Windows.Data.ListCollectionView.ProcessCollectionChanged(NotifyCollectionChangedEventArgs args)
            at System.Windows.Data.CollectionView.OnCollectionChanged(Object sender, NotifyCollectionChangedEventArgs args)
       InnerException:

Ответы [ 2 ]

4 голосов
/ 08 февраля 2012

Возможно ли, что у вас есть несколько потоков, делающих одновременный доступ к коллекции, которая не является поточно-ориентированной? Скажем, один поток удаляет элемент, а другой читает или добавляет? Это определенно вызвало бы этот тип ошибки. Как правило, классы коллекций .NET (за исключением классов System.Collections.Concurrent) не являются поточно-ориентированными. У вас может быть несколько читателей, но любая модификация коллекции потребует эксклюзивного доступа - защищена блокировкой или блокировкой чтения / записи.

1 голос
/ 08 февраля 2012

Можно с уверенностью предположить, что App.g.cs не в том, в чем проблема, так что, как вы сказали, не так уж и много.Итак, вот вам мой совет: посмотрите на внутреннее исключение.Эти вещи очень удобны, и я готов поспорить, что у вас есть внутреннее исключение, по крайней мере, на один слой глубиной.

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