2009-05-20 20 views
15

Sto sviluppando un componente aggiuntivo per AutoCAD 2009. L'output del progetto è una libreria di classi. Quando tento di eseguire il debug e caricare la libreria di classi, viene visualizzato il messaggio "LoaderLock è stato rilevato". Ho scritto questi componenti aggiuntivi per un po 'e questo è il primo messaggio di questo tipo che ho visto.Perché ricevo l'avviso "LoaderLock rilevato" durante il debug?

  1. Dove posso iniziare a cercare di capirlo?
  2. Che cos'è LoaderLock e perché mi dà fastidio ora?

LoaderLock rilevato Messaggio: tentativo di esecuzione gestita all'interno del blocco del caricatore del sistema operativo. Non tentare di eseguire codice gestito all'interno di una funzione di inizializzazione di DllMain o di immagine poiché ciò potrebbe causare il blocco dell'applicazione.

Sono andato a Debug -> Exceptions -> "Managed Debugging Assistants", trovato "LoaderLock" e deselezionata la casella di controllo "Thrown".

Posso eseguire di nuovo il debug ma cosa ho fatto e perché ho dovuto farlo? Ciò causerà altri problemi per me?

risposta

16

Il blocco del caricatore è un blocco a livello di processo utilizzato dal sistema per sincronizzare l'accesso al caricamento delle DLL in uno spazio di indirizzamento del processo. Le funzioni che caricano DLL, DLL libere, informazioni su query DLL, ecc., Acquisiscono tutte il blocco del caricatore. Ciò che di solito colpisce gli sviluppatori è il fatto che il blocco del caricatore viene trattenuto mentre DllMain è in esecuzione - questo significa che un blocco del sistema operativo di cui non si è normalmente a conoscenza può essere trattenuto durante l'esecuzione del codice.

Il blocco del caricatore può essere visualizzato ad un livello molto basso nella gerarchia di blocco. Il codice in esecuzione sotto il blocco del caricatore durante DllMain può essere la causa di deadlock. Ad esempio, il CLR ha il proprio set di blocchi interni che potrebbe contenere durante il caricamento delle DLL. Se si chiama il codice gestito da DllMain, è possibile fare in modo che il CLR sul thread acquisisca uno di questi blocchi mantenendo il blocco del caricatore. Se il CLR su un altro thread aveva acquisito quel blocco (causando il blocco dell'origine in DllMain da bloccare) e quindi provato a caricare una DLL che acquisiva il blocco del caricatore, il processo si bloccava.

Sembra che il CLR stia cercando di rilevare preventivamente il codice gestito in esecuzione sotto il blocco del caricatore. Quando si vede lo stack da questo errore nel debugger, identificare cosa sta causando il codice gestito in esecuzione da DllMain e rimuoverlo.

3

Nella mia esperienza con AutoCAD, l'avviso LoaderLock può essere tranquillamente ignorato. Non è un segno del tuo codice che fa qualcosa di sbagliato, ma piuttosto l'avviso viene sollevato a causa del modo in cui AutoCAD sta caricando e inizializzando la tua applicazione.

+0

Ho segnato questa risposta da @ Bojan-Resnik come utile perché risponde potenzialmente l'ultima domanda del PO: sarà questo causare altri problemi per me? La risposta è "forse no, il problema 'potrebbe' essere solo un problema di debugger e può essere ignorato." Trovo utile questo, anche se le informazioni di Michael sono state ovviamente molto utili per capire il problema. – TonyG

1

Questo un bug in Visual Studio 2005. Leggi questo articolo per maggiori dettagli: http://support.microsoft.com/kb/913996

+3

Quella KB è stata una buona scoperta ma sto riscontrando questo errore frequentemente in VS2010SP1 durante il debug di un AddIn Excel XLL - che è quello che mi ha portato a questa discussione. – TonyG

Problemi correlati