2009-10-26 15 views
11

Kod które odziedziczyły się zawiesza się dość mocno z powodu następującego błędu (nie zmienione w ogóle):Jak debugować „Bezpieczny uchwyt został zamknięty” błąd

System.ObjectDisposedException: Safe handle has been closed 
    at Microsoft.Win32.UnsafeNativeMethods.GetOverlappedResult(
      SafeFileHandle hFile, NativeOverlapped* lpOverlapped, 
      Int32& lpNumberOfBytesTransferred, Boolean bWait) 
    at System.IO.Ports.SerialStream.EventLoopRunner.WaitForCommEvent() 
    at System.Threading.ThreadHelper.ThreadStart_Context(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) 
    at System.Threading.ThreadHelper.ThreadStart() 

to tylko złowieniu jak poprzedni programiści dodali AppDomain.UnhandledException Event.

Po usunięciu aplikacja ulega awarii z komunikatem Dr Watsona (wysłać opinię itp.), A nie zwykłym dialogiem .NET (z opcją kontynuacji i śledzeniem stosu).

Sprawdziłem i nie jest związane z Thread.Abort

Jak mogę iść o próbując znaleźć przyczynę tego problemu, jak się wydaje, z ślad stosu, aby nie być w kodzie aplikacji?

Odpowiedz

8

Z faktu, że odnoszą się do System.IO.Ports.SerialStream.EventLoopRunner.WaitForCommEvent() i Microsoft.Win32.UnsafeNativeMethods, zagroziłbym, że masz komponent COM, który ma wewnętrzne wątki uzyskujące dostęp do portu, np. dla danych szeregowych lub TCP/IP.

Wyglądałoby na to, że wątek zgłasza wyjątek podczas sekwencji startowej. Prawdopodobnie próbuje uzyskać dostęp do niedostępnego lub nieistniejącego portu. To się nie powiedzie, a wyjątek nie jest obsługiwany i w ten sposób propaguje powrót przez kod.

Próbujesz zarejestrować więcej informacji ze zdarzenia UnhandledException, aby dowiedzieć się, od czego może zacząć.

+0

to działa jak urok usunąłem wszystkie podłączone urzšdzenia USB za wyjątkiem mojej myszki i to działa ed. Nie wiem, dlaczego tak się stało. – Nitesh

-1

Dodanie tego kodu przed dokonaniem połączenia czasami może w tym pomóc (jeśli przyczyną jest to, że informacje dotyczące bezpieczeństwa na nowym wątku brakuje.

AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal); 

Zakładając, że używasz uwierzytelniania systemu windows Zapewnia nowo utworzone wątki są tworzone z właściwym kontekście bezpieczeństwa

Dokumentacja dostępna jest tutaj:.. https://msdn.microsoft.com/en-us/library/system.security.principal.principalpolicy(v=vs.110).aspx

+3

Gdzie sugerujesz dodanie tego i jak to się odnosi do błędu Bezpieczny uchwyt? –

+1

Tak, to jest kłamliwe. Otwarcie połączenia z gniazdem i wysłanie pliku nie powinno wymagać takich niejasnych i specjalnych ustawień, nie mówiąc już tylko o funkcjonowaniu, aby zwiększyć szanse, że to zadziała. wtf. są to systemy deterministyczne. nie powinno zawieść, wysyłając plik o pojemności 100 GB z powodu losowego bezpiecznego zamknięcia klamki. to NIGDY się nie zdarzyło i wydaje się być czymś wprowadzonym przez ostatnią aktualizację Windows pod koniec 2014 roku. – Triynko

+0

Jeśli dobrze pamiętam, dodałem ją do nowo rozpoczętego wątku zaraz po rozpoczęciu. – ScottB

Powiązane problemy