লোডার লক ত্রুটি


95

আমি সি # তে কোড লিখে সি ++ ডিএল তৈরি করছি।

আমি বলছি একটি ত্রুটি

লোডারলক সনাক্ত হয়েছে বার্তা: ওএস লোডার লকের ভিতরে পরিচালিত সম্পাদনের চেষ্টা করা হচ্ছে। DllMain বা চিত্র সূচনা ফাংশনের অভ্যন্তরে পরিচালিত কোড চালানোর চেষ্টা করবেন না যেহেতু এটি করার ফলে অ্যাপ্লিকেশনটি স্তব্ধ হয়ে যেতে পারে।

আমি এই ত্রুটিটির অর্থ কী তা বোঝার চেষ্টা করেছি, তবে আমি অর্থহীন নিবন্ধগুলি আঁকছি, বেশিরভাগই বলেছি এটি কেবল একটি সতর্কতা, এবং আমার এটি ভিজ্যুয়াল স্টুডিওতে স্যুইচ করা উচিত। অন্যান্য সমাধানগুলি আইটিউনসের কারণে বলে মনে হচ্ছে বা ডাইরেক্টএক্সের সাথে প্রোগ্রাম করার সময় এই সমস্যা দেখা দেয়। আমার সমস্যা দুটির সাথেই যুক্ত নয়।

কেউ কি ব্যাখ্যা করতে পারেন, এর আসলে কী অর্থ?


আমি আপনার সাথে অনুভব করছি, আমিও একই সমস্যা পেয়েছি এবং যা আমাকে সবচেয়ে বেশি আশ্চর্য করে: আমার ডেল এমনকি কোড পরিচালিত হয় না, তবে কেন / কীভাবে এটি (অস্তিত্বহীন) ডেলমেইনে পরিচালিত কোড ব্যবহার করার কথা? ??
স্যাম

ডিবাগ মোডে ডেটাসেটের সামগ্রীগুলি দেখার চেষ্টা করার সময় আমি এই সতর্কতাটি পেয়েছি। আমি সি # ব্যবহার করছি, এটি নিয়মিত উইন্ডোজ আকারে ঘটেছিল।
Soenhay

যেহেতু আপনি কারণটি সনাক্ত করতে পারবেন না (যেমন আপনি শীর্ষ উত্তরে মন্তব্য করেছেন) আমার সন্দেহ হয় যে আপনি এমন একটি ডিএল আছে যা আপনি অপরাধ করছেন।
জন থোমেটস

উত্তর:


70

আপনাকে মেনুতে ডিবাগ যেতে হবে -> ব্যতিক্রমগুলি, পরিচালিত ডিবাগিং সহায়কগুলি খুলুন, লোডারলকটি খুঁজে বের করুন এবং চিরকুট

http://goo.gl/TGAHV


21
হ্যাঁ, সতর্কতাটি বন্ধ করার উপায় এটি; তবে 2 বছর পরেও আমি ঠিক বুঝতে পারি নি যে এটি কেন ঘটছে।
দেবদত্ত টেংশে

4
এটি আমার সাথে ভিএস 2012

4
আমি আপনার সাথে রয়েছি @ কোহান আমি একটি পুরানো প্রকল্পও খুলেছি এবং ত্রুটি পেয়েছি। আমি ব্যতিক্রমটি অক্ষম করেছি তবে এটি প্রতিরোধে কী করা যেতে পারে তা বুঝতে চাই।
পিমেন্টা

4
আমি যদি প্রকল্পটি নেটিভ ডিবাগিং হিসাবে চালিত করি, সমস্ত ব্যতিক্রম ডিফল্ট (সমস্ত পুনরায় সেট করুন) সহ, ডিবাগ উইন্ডো <mda: msg xMLns: mda = " স্কিমাস.মাইক্রোসফট / সিএলআর /2004 / 10 / মদা "> <! - - ওএস লোডার লকের ভিতরে পরিচালিত সম্পাদনের চেষ্টা করা হচ্ছে .... ইত্যাদি -> <এমডিএ: লোডারলকএমএসজি ব্রেক = "সত্য" /> </ এমডিএ: জিপি> তারপর ভিএস সিটিওর ক্রম চলাকালীন একাধিক ব্রেকপয়েন্টগুলি উপস্থাপন করে। লোডারলক সেটিংসটি বন্ধ করা কোনও লাভ করে না। আমার জন্য, আমাকে শীর্ষ এমডিএ বিকল্পটি টিক করতে হবে (সমস্ত এমডিএর জন্য) তারপরে শীর্ষ স্তরের বিকল্পটি (কোন এমডিএর জন্য নয়) টিপুন, তারপরে বিল্ড + রান করুন। এটি আমার সহকর্মীর পক্ষে কাজ করে নি।
গিলসডিমিল্ডন

17
ভিএস ২০১৫ এ একটি আপডেট ভাগ করে নিতে চাইলে আপনার এখনই যেতে হবে Debug->Windows->Exception Settings। বাকিগুলি একইManaged Debugging Assistants \ LoaderLock
jxramos

52

লোডার লকের সাধারণ ধারণা: সিস্টেমটি একটি লকের ভিতরে ডেলমেইনে কোড চালায় (যেমন - সিঙ্ক্রোনাইজেশন লক হিসাবে)। অতএব, এখানে বর্ণিত হিসাবে ডেলমেনের অভ্যন্তরে তুচ্ছ কোড চালানো "একটি অচলাবস্থার জন্য জিজ্ঞাসা করছে" ।

প্রশ্নটি হল, আপনি ডেলমেইনের ভিতরে কোড চালানোর চেষ্টা করছেন কেন? এই কোডটি ডেলমেনের প্রেক্ষাপটে চালানো কি গুরুত্বপূর্ণ বা আপনি একটি নতুন থ্রেড তৈরি করতে এবং এতে কোড চালাতে পারেন, এবং ডেলমেনের অভ্যন্তরে কোডটি কার্যকর করার জন্য অপেক্ষা করবেন না?

আমি বিশ্বাস করি যে বিশেষভাবে ম্যানেজড কোড নিয়ে সমস্যাটি হ'ল এই যে পরিচালিত কোড চালানোতে সিএলআর এবং এ জাতীয় পছন্দ লোড করা জড়িত থাকতে পারে এবং সেখানে কী ঘটতে পারে যা অচলাবস্থার কারণ হতে পারে তা জানা নেই ... "এই সতর্কতাটি অক্ষম করার পরামর্শটি আমি গ্রহণ করব না" "যদি আমি আপনি ছিলাম কারণ বেশিরভাগ সম্ভাবনা হ'ল আপনি কিছু অ্যাপ্লিকেশনগুলিকে অপ্রত্যাশিতভাবে কিছু পরিস্থিতিতে ঝুলতে দেখবেন।


4
আমি ডিরেক্ট 3 ডি অ্যাপ্লিকেশন নিয়ে কাজ করছি। এটি একটি EXE। তবে আমি এখনও এই ত্রুটিটি দেখছি। এই ধারণাটি কীভাবে সেরা করবেন?
অগ্নেল কুরিয়ান

18

.NET 4.0 এর জন্য আপডেট করুন এবং আরও বেশি ফ্রেম ওয়ার্কস

নেট নেট ২.০ এর সময় জিজ্ঞাসিত এটি একটি পুরানো প্রশ্ন, যখন মিক্সড মোড ডিএলএলগুলির পক্ষে সমর্থনের ক্ষেত্রে এলোমেলো ডেডলকের ঝুঁকির গুরুতর সূচনা হয়। । নেট 4.0 হিসাবে, মিশ্র মোড ডিএলএলগুলির সূচনা পরিবর্তন হয়েছে। এখন আরম্ভের দুটি পৃথক পর্যায় রয়েছে:

  1. নেটিভ ইনিশিয়েশন, ডিএলএল-এর প্রবেশ পয়েন্টে ডাকা হয়, যার মধ্যে নেটিভ সি ++ রান-টাইম সেটআপ এবং আপনার 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 কে ওয়ার্নিং দিয়ে কিছুটা সহায়তা করে যদি এটি সনাক্ত করে যে ডেলমেইনকে নিয়ন্ত্রণহীন হিসাবে ঘোষণা করা হয়নি:

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

সিটিটি ডি + ই টিপুন এবং তারপরে পরিচালিত ডিবাগিং সহায়ক নোডটি ব্যয় করুন। তারপরে লোডারলকটি চেক করা হয়নি।

আশা করি এটা তোমাকে সাহায্য করবে।


শর্টকাটটি হল Alt + d + x
নারায়ণ

4
শর্টকাটটি আসলে প্রথম রান করার সময় আপনি যে কনফিগারেশনটি নির্দিষ্ট করেছেন তা নির্ভর করে। সি # শর্টকাট বিন্যাসটি (Ctrl + D, E)। (এছাড়াও আপনি বিকল্পগুলিতে-> পরিবেশ-> কীবোর্ডে এই ফাংশনটিতে যে কোনও মূল সংমিশ্রণ নির্ধারণ করতে পারেন))
অ্যাডাম এলএস

6

কল্যাণকামী সেই কথা মনে করিয়ে VS2017 ব্যবহারকারীদের যে আপনার অক্ষম "প্রয়োজন ব্যতিক্রম সাহায্যকারী " এর পরিবর্তে " ব্যতিক্রম সহায়ক লোডার লক ত্রুটি, যা সেটিং পথ থেকে বিরত" (VS2017 আগে) Debug-> ব্যতিক্রম । এই সমস্যাটি স্রেফ দৌড়ে গিয়ে সমাধানের জন্য অনুসন্ধান করতে 2 ঘন্টা নষ্ট করেছেন ...


আমার "ডিবাগ" এর অধীনে "ব্যতিক্রম" নেই। আমার ভিএস2017 সম্প্রদায় রয়েছে 15.8.4
অ্যালেক্স

@ অ্যালেক্স, ডিবাগের জন্য পরীক্ষা করুন -> উইন্ডোজ -> ব্যতিক্রমী সেটিংস, বা Ctrl + Alt + E টিপুন
মিসটিকা

4

দেশীয় কোডে লিখিত COM- অবজেক্টের উদাহরণ তৈরি করার সময় আমি সম্প্রতি এই ত্রুটিটি পেয়েছি:

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

রিমোটেবল অবজেক্ট (মার্শালবাইরফবজেক্ট) দিয়ে ত্রুটিটি ঘটতে পারে এবং এই সমাধানটি তাদের পক্ষে কার্যকর হয় না।
ম্যাথিউউ

3

আমি একটি সি ++ সিএলআর ডিএলএল (এমএসভিএস ২০১৫) তৈরি করছি যা একটি নিয়ন্ত্রণহীন ডিএলএল-এ কল করতে হবে এবং নিয়ন্ত্রণহীন কোডটি সংজ্ঞায়িত করতে হবে। কোডের একটি প্রদত্ত ক্ষেত্রের জন্য এটি কোন মোডে রয়েছে তা নিয়ন্ত্রণ করতে আমি # প্রগমা পরিচালিত এবং #pragma নিয়ন্ত্রণহীন ব্যবহার করি।

আমার ক্ষেত্রে আমি #Pragma নিয়ন্ত্রণহীনভাবে আমার DllMain () এর সামনে রেখেছি এবং এটি সমস্যার সমাধান করেছে। মনে হচ্ছে মনে হচ্ছে আমি DllMain () এর একটি পরিচালিত সংস্করণ চাই।


2

ভিজ্যুয়াল স্টুডিওতে ডিবাগার পরিচালিত অ্যাপ্লিকেশনগুলি চালিত করে যেগুলি এক বা একাধিক ডিএলএল ফাইলগুলিতে মাইক্রোসফ্ট ফাউন্ডেশন ক্লাসের সংস্করণ 8.0 ব্যবহার করে।

এখানে পুরোপুরি পড়ুন: http : //msdn.mic Microsoft.com/en-us/library/aa290048(vs.71).aspx


2

আমার ভিজ্যুয়াল স্টুডিও 2017 উদাহরণের সেটিংয়ের পাথ হ'ল ডিবাগ -> উইন্ডোজ -> ব্যতিক্রম সেটিংস। ব্যতিক্রম সেটিংস "উইন্ডো" নীচের ট্যাব গোষ্ঠীতে প্রদর্শিত হয়েছে (আলাদা উইন্ডোর বিপরীতে), এটি লক্ষ্য করতে আমাকে কিছুটা সময় নিয়েছিল। "লোডার" অনুসন্ধান করুন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.