2009-05-20 19 views
15

Estoy desarrollando un complemento para AutoCAD 2009. El resultado del proyecto es una biblioteca de clases. Cuando intento depurar y cargar la biblioteca de clases, aparece este mensaje de "LoaderLock was detected". He estado escribiendo estos complementos por un tiempo y este es el primer mensaje de este tipo que he visto.¿Por qué recibo la advertencia "LoaderLock was detected" al depurar?

  1. ¿Por dónde empiezo a tratar de resolver esto?
  2. ¿Qué es LoaderLock y por qué me está molestando ahora?

LoaderLock se detectó Mensaje: intento de ejecución administrada dentro del bloqueo del cargador del sistema operativo. No intente ejecutar código administrado dentro de una función de inicialización de DllMain o de imagen ya que al hacerlo puede hacer que la aplicación se cuelgue.

Fui a Debug -> Exceptions -> "Managed Debugging Assistants", encontré "LoaderLock" y desmarqué la casilla "Thrown".

Puedo depurar de nuevo, pero ¿qué hice y por qué tuve que hacerlo? ¿Esto me causará otros problemas?

Respuesta

16

El bloqueo del cargador es un bloqueo de todo el proceso utilizado por el sistema para sincronizar el acceso a la carga de DLL en un espacio de direcciones de proceso. Las funciones que cargan archivos DLL, DLL libres, información DLL de consulta, etc., todos adquieren el bloqueo del cargador. Lo que generalmente afecta más a los desarrolladores es que el bloqueo del cargador se mantiene mientras DllMain también se está ejecutando; esto significa que un bloqueo del sistema operativo del que normalmente no se tiene conocimiento se puede mantener mientras se ejecuta el código.

El bloqueo del cargador se puede ver como un nivel muy bajo en la jerarquía de bloqueo. El código que se ejecuta bajo el bloqueo del cargador durante DllMain puede ser la causa de interbloqueos. Por ejemplo, el CLR tiene su propio conjunto de bloqueos internos que podría contener mientras carga los archivos DLL. Si llama al código administrado desde su DllMain, puede hacer que el CLR en su hilo adquiera uno de estos bloqueos mientras mantiene el bloqueo del cargador. Si el CLR en otro hilo había adquirido ese bloqueo (lo que causaba que el hilo de origen en DllMain se bloquease) y luego intentaba cargar un archivo DLL que adquiriría el bloqueo del cargador, su proceso se estancaría.

Parece que el CLR está tratando de detectar preventivamente el código administrado en ejecución bajo el bloqueo del cargador. Cuando vea la pila de este error en el depurador, identifique qué está causando que se ejecute su código administrado dentro de un DllMain y elimínelo.

3

En mi experiencia con AutoCAD, la advertencia de LoaderLock se puede ignorar de forma segura. No es una señal de que su código esté haciendo algo incorrecto, sino que la advertencia aparece debido a la forma en que AutoCAD está cargando e inicializando su aplicación.

+0

he marcado esta respuesta por @ bojan-Resnik como útil debido a que potencialmente responde a la última pregunta de la OP: ¿Será esto causa otros problemas ¿para mi? La respuesta es "tal vez no, el problema 'podría' simplemente ser un problema de depurador y puede ignorarse". Me parece útil, aunque la información de Michael fue, por supuesto, también muy útil para comprender el problema. – TonyG

1
Este

un error en Visual Studio 2005. Lee este artículo para más detalles: http://support.microsoft.com/kb/913996

+3

Ese KB fue un buen hallazgo, pero estoy viendo este error con frecuencia en VS2010SP1 al depurar un complemento de Excel XLL, que es lo que me llevó a este hilo. – TonyG

Cuestiones relacionadas