लोडर लॉक एरर


95

C # में कोड लिखकर मैं C ++ dll पर बना रहा हूं।

मुझे एक त्रुटि मिलती है, कह रही है

LoaderLock का पता चला था संदेश: OS लोडर लॉक के अंदर प्रबंधित निष्पादन का प्रयास। DllMain या छवि आरंभीकरण फ़ंक्शन के अंदर प्रबंधित कोड को चलाने का प्रयास न करें क्योंकि ऐसा करने से एप्लिकेशन हैंग हो सकता है।

मैंने कोशिश की कि वास्तव में इस त्रुटि का क्या मतलब है, लेकिन मैं व्यर्थ लेखों को आकर्षित कर रहा हूं, ज्यादातर कह रहा है कि यह सिर्फ एक चेतावनी है, और मुझे उस दृश्य स्टूडियो में स्विच करना चाहिए। अन्य समाधान ITunes, या DirectX के साथ प्रोग्रामिंग करते समय होने वाली इस समस्या के कारण प्रतीत होते हैं। मेरी समस्या न तो जुड़ी हुई है।

किसी को भी समझा सकते हैं, यह वास्तव में क्या मतलब है?


मैं आपके साथ महसूस करता हूं, मुझे वही समस्या मिली, और मुझे क्या आश्चर्य हुआ: मेरा dll प्रबंधित कोड भी नहीं है, इसलिए / (गैर-मौजूद) DllMain पर प्रबंधित कोड का उपयोग करना क्यों / कैसे माना जाता है ??
सैम

डिबग मोड में डेटासेट की सामग्री को देखने का प्रयास करते समय मुझे यह चेतावनी मिली। मैं c # का उपयोग कर रहा हूं, यह एक नियमित विंडोज़ फॉर्म में हुआ।
सोहने

चूंकि आप कारण का पता नहीं लगा सकते हैं (जैसा कि आपने शीर्ष उत्तर में टिप्पणी की है) मुझे संदेह है कि एक डीएल है जिसे आप लोड कर रहे हैं जो अपराध कर रहा है।
जॉन थिट्स

जवाबों:


70

आपको डीबग मेनू पर जाने की आवश्यकता है -> अपवाद, प्रबंधित डीबगिंग सहायक खोलें, LoaderLock और अनचेक खोजें

http://goo.gl/TGAHV


21
हां, यह चेतावनी को बंद करने का तरीका है; लेकिन 2 साल बाद भी मुझे ठीक से पता नहीं चला कि ऐसा क्यों हो रहा था।
देवदत्त तेंगशे

2
यह मेरे साथ वीएस 2012 में एक पुरानी परियोजना खोलने के लिए हुआ
4imble

1
मैं आपके साथ हूं @Kohan मैंने एक पुराना प्रोजेक्ट भी खोला है और मुझे त्रुटि मिली है। मैंने अपवाद को अक्षम कर दिया है, लेकिन यह समझना चाहूंगा कि इसे रोकने के लिए क्या किया जा सकता है।
पिंता

1
यदि मैं प्रोजेक्ट को मूल डिबगिंग के रूप में चलाता हूं, तो डिफ़ॉल्ट पर सभी अपवादों के साथ (सभी रीसेट करें), डीबग विंडो दिखाता है <mda: msg xmlns: mda = " schemas.microsoft.com/CLR/2004/10/mda "> <! -! - OS लोडर लॉक के अंदर प्रबंधित निष्पादन का प्रयास करना .... आदि -> <mda: loaderLockMsg ब्रेक = "सत्य" /> </ mda: msg> VS फिर CTOR अनुक्रम के दौरान कई ब्रेकप्वाइंट प्रस्तुत करता है। LoaderLock सेटिंग को बंद करने से मदद नहीं मिलती है। मेरे लिए, मुझे शीर्ष MDA विकल्प (ALL MDA के लिए) पर टिक करना था और फिर शीर्ष स्तर विकल्प (बिना MDA के) के लिए अनचेक करें, फिर + रन बनाएं। यह मेरे सहयोगी के लिए काम नहीं किया।
जाइल्समिडलटन

17
VS2015 में एक अपडेट साझा करना चाहता था, अब आपको जाने की आवश्यकता है Debug->Windows->Exception Settings। बाकी के साथ समान हैManaged Debugging Assistants \ LoaderLock
jxramos

52

लोडर लॉक का सामान्य विचार: सिस्टम एक लॉक के अंदर DllMain में कोड चलाता है (जैसे - सिंक्रोनाइज़ेशन लॉक)। इसलिए, DllMain के अंदर गैर-तुच्छ कोड चलाने के लिए "एक गतिरोध के लिए पूछ रहा है", जैसा कि यहां वर्णित है

सवाल यह है कि आप DllMain के अंदर कोड चलाने की कोशिश क्यों कर रहे हैं? क्या यह महत्वपूर्ण है कि यह कोड DllMain के संदर्भ में चलता है या क्या आप एक नया थ्रेड स्पॉन कर सकते हैं और उसमें कोड चला सकते हैं, और DllMain के अंदर कोड को समाप्त करने के लिए इंतजार नहीं करेंगे?

मेरा मानना ​​है कि विशेष रूप से मांगे गए कोड के साथ समस्या यह है कि प्रबंधित कोड चलाने में सीएलआर और इसी तरह लोड करना शामिल हो सकता है और कोई भी नहीं जानता कि वहां क्या हो सकता है जिसके परिणामस्वरूप गतिरोध होगा ... मैंने इस चेतावनी को अक्षम करने की सलाह पर ध्यान नहीं दिया। "अगर मैं तुम थे क्योंकि सबसे अधिक संभावना है कि आप पाएंगे कि आपके आवेदन कुछ परिदृश्यों के तहत अप्रत्याशित रूप से लटके हुए हैं।


4
मैं Direct3D एप्लिकेशन पर काम कर रहा हूं। यह एक EXE है। हालाँकि, मैं अभी भी इस त्रुटि को देख रहा हूँ। किसी भी विचार कैसे सबसे अच्छा यह तय करने के लिए?
एगेल कुरियन

18

.NET 4.0 और अधिक के लिए अद्यतन प्राप्त करें

.Net 2.0 के समय में पूछा गया यह एक पुराना प्रश्न है, जब मिश्रित मोड के लिए समर्थन में DLL को गंभीर आरंभीकरण की समस्या थी, यादृच्छिक गतिरोध की संभावना थी। .Net 4.0 के रूप में, मिश्रित मोड DLLs का इनिशियलाइज़ेशन बदल गया है। अब आरंभीकरण के दो अलग-अलग चरण हैं:

  1. मूल आरंभीकरण, जिसे DLL के प्रवेश बिंदु पर कहा जाता है, जिसमें देशी C ++ रन-टाइम सेटअप और आपके DllMain पद्धति का निष्पादन शामिल है।
  2. प्रबंधित आरंभीकरण, सिस्टम लोडर द्वारा स्वचालित रूप से निष्पादित।

चूंकि चरण # 2 लोडर लॉक के बाहर किया जाता है, इसलिए कोई गतिरोध नहीं है। विवरण मिश्रित विधानसभाओं के प्रारंभ में वर्णित हैं ।

यह सुनिश्चित करने के लिए कि आपकी मिश्रित मोड असेंबली को मूल निष्पादन योग्य से लोड किया जा सकता है, केवल एक चीज जिसे आपको जांचने की आवश्यकता है वह यह है कि DllMain विधि को मूल कोड के रूप में घोषित किया गया है। #pragma unmanagedयहाँ मदद कर सकता है:

#pragma unmanaged

BOOL APIENTRY DllMain(HMODULE hModule,
    DWORD  ul_reason_for_call,
    LPVOID lpReserved
    )
{
    ... // your implementation here
}

यह भी महत्वपूर्ण है कि DllMain को प्रत्यक्ष या अप्रत्यक्ष रूप से कॉल करने वाला कोई भी कोड अप्रबंधित है। यह DllMain द्वारा उपयोग की जाने वाली कार्यक्षमता के प्रकार को सीमित करने के लिए समझ में आता है ताकि आप DllMain से आने वाले सभी कोड का पता लगा सकें और यह सुनिश्चित कर सकें कि यह सब संकलित है#pragma unmanaged

कम्पाइलर आपको C4747 को चेतावनी देते हुए थोड़ी मदद करता है अगर यह पता लगाता है कि DllMain को अप्रबंधित घोषित नहीं किया गया है:

1>  Generating Code...
1>E:\src\mixedmodedll\dllmain.cpp : warning C4747: Calling managed 'DllMain': Managed code may not be run under loader lock, including the DLL entrypoint and calls reached from the DLL entrypoint

हालांकि कंपाइलर कोई चेतावनी उत्पन्न नहीं करेगा यदि DllMain अप्रत्यक्ष रूप से कुछ अन्य प्रबंधित फ़ंक्शन को कॉल करता है, तो आपको यह सुनिश्चित करने की आवश्यकता है कि ऐसा कभी नहीं होता है, अन्यथा आपका एप्लिकेशन बेतरतीब ढंग से गतिरोध कर सकता है।


6

प्रेस ctr d + e फिर एक्सपेंडेड मैनेजिंग डेबगिंग असिस्टेंट नोड। फिर LoaderLock को अनचेक किया।

आशा है कि यह आपकी मदद करेगा।


शॉर्टकट है alt + d + x
नारायण

3
शॉर्टकट वास्तव में आपके द्वारा पहले रन के दौरान उपयोग किए जाने वाले कॉन्फ़िगरेशन पर निर्भर करता है। C # शॉर्टकट लेआउट (Ctrl + D, E) है। (इसके अलावा आप इस फ़ंक्शन में किसी भी महत्वपूर्ण संयोजन को विकल्प-> पर्यावरण-> कीबोर्ड में निर्दिष्ट कर सकते हैं।)
एडम एलएस

5

कृपया उन VS2017 उपयोगकर्ताओं को याद दिलाएं जिन्हें आपको लोडर लॉक त्रुटि से रोकने के लिए " अपवाद सहायक " (VS2017 से पहले) के बजाय " अपवाद सहायक " को अक्षम करने की आवश्यकता है , जो कि सेटिंग मार्ग डिबग-> अपवाद है । बस इस समस्या के लिए भाग गया और 2 घंटे बर्बाद कर समाधान खोज रहा है ...


मेरे पास "डीबग" के तहत "अपवाद" नहीं है। मेरे पास VS2017 कम्युनिटी 15.8.4
एलेक्स

@ एलेक्स, डिबग के लिए जांचें -> विंडोज -> अपवाद सेटिंग, या Ctrl + Alt + E
मिस्टिका जूल 22'19

4

देशी कोड में लिखे गए COM-Object का उदाहरण बनाते समय मुझे हाल ही में यह त्रुटि मिली:

m_ComObject = Activator.CreateInstance(Type.GetTypeFromProgID("Fancy.McDancy"));

इससे वर्णित त्रुटि हुई। एक "लोडरलॉक का पता लगाया गया था" - अपवाद फेंका गया था।

मैंने अतिरिक्त थ्रेड में ऑब्जेक्ट-इंस्टेंस बनाकर इस त्रुटि को पार कर लिया:

ThreadStart threadRef = new ThreadStart(delegate { m_ComObject = Activator.CreateInstance(Type.GetTypeFromProgID("Fancy.McDancy")); });
Thread myThread = new Thread(threadRef);

myThread.Start();
myThread.Join(); // for synchronization

त्रुटि रिमोटेबल ऑब्जेक्ट्स (MarsBBRROObject) के साथ हो सकती है, और यह समाधान उन लोगों के लिए काम नहीं करता है।
मैथ्यू

3

मैं एक C ++ CLR DLL (MSVS2015) का निर्माण कर रहा हूं, जिसमें एक अप्रबंधित DLL में कॉल करना है और मानवरहित कोड को परिभाषित करना है। मैं कोड के दिए गए क्षेत्र के लिए क्या मोड नियंत्रित करने के लिए #pragma प्रबंधित और #pragma अप्रबंधित का उपयोग करता हूं।

मेरे मामले में मैंने बस अपने DllMain () के सामने अप्रकाशित किया और इससे समस्या हल हो गई। ऐसा लगता है कि मैं DllMain () का एक प्रबंधित संस्करण चाहता था।


2

यह समस्या उस तरीके से होती है, जिस तरह से Visual Studio में डीबगर प्रबंधित अनुप्रयोग चलाता है जो Microsoft Foundation Classes संस्करण 8.0 का उपयोग एक या अधिक DLP फ़ाइलों में करता है।

इस पर पूरी तरह से पढ़ें: http://msdn.microsoft.com/en-us/library/aa290048(vs.71).aspx


2

मेरे दृश्य स्टूडियो 2017 उदाहरण में सेटिंग पथ डिबग है -> विंडोज -> अपवाद सेटिंग्स। अपवाद सेटिंग "विंडो" नीचे टैब समूह (एक अलग विंडो के विपरीत) में दिखाई दी, मुझे इसे नोटिस करने में थोड़ा समय लगा। "लोडर" के लिए खोजें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.