2009-10-26 18 views
11

Código, que he heredado sigue fallando a cabo más poderosamente con el siguiente error (no ha cambiado en absoluto):Cómo depurar "manija de seguridad se ha cerrado" error

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() 

Esto sólo se está atrapado como el anterior los desarrolladores agregaron un AppDomain.UnhandledException Event.

Si lo elimino, la aplicación simplemente falla con un mensaje de Dr Watson (enviar comentarios, etc. ...) y no con el cuadro de diálogo .NET habitual (con la opción de continuar y el seguimiento de la pila).

He comprobado y no está relacionada con Thread.Abort

¿Cómo hago para tratar de encontrar la causa de este problema, tal como aparece, desde el seguimiento de la pila, a no ser en el código de la aplicación?

Respuesta

8

Por el hecho de que se hace referencia a System.IO.Ports.SerialStream.EventLoopRunner.WaitForCommEvent() y Microsoft.Win32.UnsafeNativeMethods Me atrevería a decir que tiene un componente COM que tiene subprocesos internos que acceden a un puerto, p. para datos seriales o TCP/IP.

Parecería que el hilo arroja una excepción durante la secuencia de inicio. Posiblemente está intentando acceder a un puerto no disponible o no existente. Esto falla y la excepción no se maneja y, por lo tanto, se propaga a través del código.

Intentando registrar más información del evento UnhandledException para tener una idea de dónde puede comenzar esto.

+0

Esto funciona como encanto he quitado todos los legados USB conectados, excepto el ratón y trabajo ed. No estoy seguro, por qué sucedió esto. – Nitesh

-1

La adición de este código antes de hacer la llamada a veces puede ayudar con esto (si la razón es que la información de seguridad en el nuevo hilo no se encuentra:.

AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal); 

Suponiendo que utiliza la autenticación de Windows Garantiza temas creados recientemente se crea con el contexto de seguridad adecuado

la documentación está disponible aquí:.. https://msdn.microsoft.com/en-us/library/system.security.principal.principalpolicy(v=vs.110).aspx

+3

¿Dónde sugiere que se agregue esto y cómo se relaciona esto con el error de manejo seguro? –

+1

Sí, esto es ridículo. Abrir una conexión de socket y enviar un archivo no debería requerir ajustes tan oscuros y especiales, y mucho menos solo funcionar para aumentar las posibilidades de que funcione. wtf. estos son sistemas deterministas. no debería fallar el envío de un archivo de 100 GB debido a algún cierre seguro al azar que se cierre sola. esto NUNCA solía suceder y parece ser algo introducido por una actualización reciente de Windows a finales de 2014. – Triynko

+0

Si recuerdo correctamente, lo agregué al hilo recién iniciado justo después de que comenzó. – ScottB

Cuestiones relacionadas