DLL निर्भरता की जांच कैसे करें?


165

कभी-कभी जब मैं थोड़ा प्रोजेक्ट कर रहा होता हूं तो मैं पर्याप्त सावधान नहीं होता और गलती से एक DLL के लिए एक निर्भरता जोड़ देता हूं जिसके बारे में मुझे जानकारी नहीं है। जब मैं इस कार्यक्रम को किसी मित्र या अन्य लोगों को भेजता हूं, तो "यह काम नहीं करता है" क्योंकि "कुछ डीएलएल" गायब है। यह निश्चित रूप से है क्योंकि कार्यक्रम मेरे सिस्टम पर DLL पा सकता है, लेकिन उनके नहीं।

क्या डीएलएल निर्भरता के लिए एक निष्पादन योग्य को स्कैन करने या इन उफ़ स्थितियों को रोकने के लिए परीक्षण के लिए "स्वच्छ" डीएलएल-मुक्त वातावरण में कार्यक्रम को निष्पादित करने का एक तरीका है?


2
डीबगर हर DLL दिखाता है जो आउटपुट विंडो में लोड हो जाता है। डीबग + विंडोज + मॉड्यूल उनमें से एक सूची दिखाता है। सुनिश्चित करें कि आप उन सभी के लिए जिम्मेदार हो सकते हैं। और अपने इंस्टॉलर का परीक्षण करें जैसे आप अपने कोड का परीक्षण करते हैं, एक वीएम का उपयोग करें।
हंस पासेंट

@Hans Passant: क्या मुझे मानक विंडो DLL की पूरी सूची मिल सकती है?
orlp

Yup, c: \ windows \ system32 में Microsoft कॉपीराइट के साथ।
हंस पासेंट

2
@orlp - आप भी कोशिश कर सकते हैं dumpbin /dependents <program>। मेरा अनुमान है कि सूची में सभी DLLs लिस्टिंग की तुलना में अधिक प्रासंगिक होगा %SYSTEM%या %SYSTEM32%। MSDN पर DUMPBIN विकल्प भी देखें ।
jww

जवाबों:


104

प्रयास करें Dependency Walker(2006 में अंतिम अद्यतन) या इसके नाम का एक आधुनिक पुनर्लेखन Dependencies


20
मैंने पढ़ा है कि यह अब दिनांकित है, क्या कुछ अधिक वर्तमान है?
टैंकरस्मैश

6
यदि संभव हो तो, मैं केवल मूल ओएस प्रदाता पर भरोसा करूंगा, क्योंकि ddl निर्भरता OS नौकरी होनी चाहिए .. क्या कोई Microsoft उपयोगिता कार्यक्रम ऐसा कर सकता है? कमांड लाइन मेरे लिए ठीक है।
रॉबिन ह्सु

3
@RobinHsu: डिपेंडेंसीवॉकर विजुअल स्टूडियो 2005 तक विजुअल स्टूडियो के साथ शिप करता था। सबसे हालिया बिल्ड विंडोज ड्राइवर डेवलपमेंट किट (और आधिकारिक वेब साइट के माध्यम से उपलब्ध नहीं) के साथ शामिल है। अभी भी आधिकारिक तौर पर एक Microsoft उपकरण नहीं है, लेकिन Microsoft द्वारा स्वीकृत, प्रचारित और विज्ञापित है।
IInspectable


8
अब आंशिक रूप से C # में आंशिक रूप से किया गया एक खुला स्रोत है, " Dependencies.exe " को पूरा करें : github.com/lucasg/D dependencies । टेस्ट इंप्रेशन: थोड़ा बीटा-ईश , लेकिन यह जाहिरा तौर पर एपीआई-सेट और एसएक्सएस को संभालता है (डिपेंडेंसी वॉकर से गायब)।
स्टीन Steस्मूल

217

dumpbin विजुअल स्टूडियो टूल्स (वीसी \ बिन फ़ोल्डर) से यहां मदद कर सकते हैं:

dumpbin /dependents your_dll_file.dll

7
काम थोड़ा उपकरण, और बचाता है कुछ नया स्थापित करने के लिए जब आप पहले से ही VS स्थापित है।
जेम्स

13
हां, dumpbin.exeयह पता लगाने के लिए बहुत उपयोगी है /dependentsऔर /imports। आप इसे अन्य मशीनों पर भी उपयोग कर सकते हैं यदि आप link.exeइसके साथ कॉपी करते हैं और सुनिश्चित करें कि संबंधित x86 विज़ुअल C ++ रनटाइम रिडिस्टेबल ( msvcr120.dllविज़ुअल स्टूडियो 2013 के लिए) लक्ष्य मशीन पर उपलब्ध है। कुछ विकल्पों में अतिरिक्त निर्भरताएं होती हैं। - वैसे, उन्होंने विकल्प के नाम को खराब कर दिया, यह /PREREQUISITESबजाय /DEPENDENTSहोना चाहिए था, उन्हें लैटिन का अध्ययन करना चाहिए था।
लूमि

2
यह बहुत अच्छा है, हमने इसे अपनी निर्माण प्रणाली में एक सत्यापन चरण के रूप में जोड़ा जब अंतिम निष्पादन योग्य उत्पन्न होता है, इसलिए हम उस चीज पर निर्भर नहीं होते हैं जो शिपिंग में शामिल नहीं है।
लोथर

4
एकमात्र दोष यह है कि यह आसान उपकरण बहुत छिपा हुआ है: c: \ Program Files (x86) \ Microsoft Visual Studio \ 2017 \ Community \ VC \ Tools \ MSVC \ 14.14.26428 \ bin \ Hostx64 \ x64>
डंपबिन

1
@rkachach यदि आप Visual Studio कमांड लाइन (टूल्स -> विजुअल स्टूडियो कमांड प्रॉम्प्ट) खोलते हैं तो इसे बाहरी कमांड के रूप में पहचाना जाता है और आपको केवल "डंपबिन" टाइप करना होगा।
बेमिफेफ

45

मैं लिनक्स प्रशंसकों के लिए दिलचस्प समाधान सुझा सकता हूं। मैं इस समाधान का पता लगाने के बाद, मैं DependencyWalker से इस पर स्विच कर चुका हूँ।

आप अपने पसंदीदा का उपयोग कर सकते lddसे अधिक विंडोज से संबंधित exe, dll

ऐसा करने के लिए आपको अपने विंडोज पर Cygwin (बेसिक इंस्टॉलेशन, बिना अतिरिक्त पैकेज के) इंस्टॉल करना होगा और फिर शुरू करना होगा Cygwin Terminal। अब आप अपने पसंदीदा लिनक्स कमांड चला सकते हैं, जिनमें शामिल हैं:

$ ldd your_dll_file.dll

UPD: आप विंडोज पर git bash टर्मिनल केldd माध्यम से भी उपयोग कर सकते हैं । यदि आपके पास पहले से ही स्थापित है, तो मामले में साइबरविन स्थापित करने की आवश्यकता नहीं है।


मैं सिर्फ cygwin को स्थापित करता हूं और linux कमांडों को पाकर खुश था, लेकिन मैं अपने स्थानीय ड्राइव (C :) पर अन्य फाइलों को आरोपित करने के लिए Cygwin रूट से बाहर नहीं निकल सका। क्या यह सामान्य है?
थॉमसग्यूनेट

1
मुझे लगता है कि यह आपकी मदद कर सकता है: stackoverflow.com/questions/1850920/…
troyane

4
दुर्भाग्य से, कुछ निर्भरताएं हैं जो इस तरह नहीं पाई जाती हैं $ ldd ./Debug/helloworld.exe ??? => ??? (0x77d60000):। उपयोगिता डंपबिन सभी निर्भरता को सही ढंग से दिखाता है।
fgiraldeau

5
मैं खिड़कियों पर GIT BASH टर्मिनल के माध्यम से ldd का उपयोग करता हूं और ठीक काम करता हूं। इसलिए यदि आपके पास git है तो यह आसान होगा, cygwin को स्थापित करने की कोई आवश्यकता नहीं है। उदाहरण: borkox @ bobipc MINGW64 ~ $ ldd /c/Users/borkox/.javacpp/cache/openblas-0.3.0-1.4.2-windows-x86_64.jar.org/bytedeco/javacpp/windows-x86_64/jniopenblas_n ntdll.dll => /c/WINDOWS/SYSTEM32/ntdll.dll (0x7ffe46910000) KERNEL32.DLL => /c/WINDOWS/System32-KERNEL32.DLL (0x7ffe46610000) KERNELBASE.dll = / cc.dll dll (0x7ffe42d40000) msvcrt.dll => /c/WINDOWS/System32/msvcrt.dll (0x7ffe44120000)
Borislav Markov

1
जैसा कि पहले से ही git bash स्थापित करने वाले किसी व्यक्ति के लिए, यह एक बेहतर समाधान था। धन्यवाद!
निकोलस

28
  1. आप जिस विधानसभा के साथ काम करने की कोशिश कर रहे हैं, उसका पूरा फ़ाइल पथ देखें

  2. प्रारंभ बटन दबाएं, "देव" टाइप करें। "वीएस 2017 के लिए डेवलपर कमांड प्रॉम्प्ट" नामक कार्यक्रम लॉन्च करें।

  3. खुलने वाली विंडो में, टाइप करें dumpbin /dependents [path], [path]वह पथ कहां है जिसे आपने चरण 1 में खोजा था

  4. एंटर की दबाएं

बम, आपको अपनी निर्भरता की जानकारी मिल गई है। खिड़की इस तरह दिखनी चाहिए:

यहां छवि विवरण दर्ज करें

वीएस 2019 के लिए अपडेट: आपको अपने वीएस इंस्टॉलेशन में इस पैकेज की आवश्यकता है:यहां छवि विवरण दर्ज करें


9
  1. "डिपेंड्स" नामक एक कार्यक्रम है
  2. यदि आपने साइबरविन स्थापित किया है, तो सरल कुछ भी नहीं है

4
टूल को डिपेंडेंसी वॉकर कहा जाता है ; यह निष्पादन योग्य छवि निर्भर करता है
IInspectable

7
निर्भरता वॉकर दिनांकित है। इसका आखिरी निर्माण 2008 में हुआ है!
SuB

dependsएपीआई सेट का समर्थन नहीं करता है इसलिए यह Win7 + के लिए बेकार है।
ivan_pozdeev

8

सबसे सुरक्षित चीज में कुछ साफ वर्चुअल मशीन होती है, जिस पर आप अपने प्रोग्राम का परीक्षण कर सकते हैं। हर उस संस्करण पर जिसका आप परीक्षण करना चाहते हैं, VM को उसके प्रारंभिक स्वच्छ मूल्य पर पुनर्स्थापित करें। फिर अपने सेटअप का उपयोग करके अपने प्रोग्राम को स्थापित करें, और देखें कि क्या यह काम करता है।

Dll समस्याओं के अलग-अलग चेहरे हैं। यदि आप Visual Studio का उपयोग करते हैं और गतिशील रूप से CRT से लिंक करते हैं, तो आपको CRT DLL वितरित करना होगा। अपने वीएस को अपडेट करें, और आपको सीआरटी का एक और संस्करण वितरित करना होगा। बस निर्भरता की जाँच करना पर्याप्त नहीं है, क्योंकि आप उन लोगों को याद कर सकते हैं। एक साफ मशीन पर पूरी तरह से स्थापित करना एकमात्र सुरक्षित समाधान है, आईएमओ।

यदि आप एक पूर्ण विकसित परीक्षण वातावरण सेटअप नहीं करना चाहती और विंडोज 7 है, तो आप प्रारंभिक साफ मशीन के रूप में XP-मोड का उपयोग कर सकते हैं और XP-अधिक वीएम नकल करने।


6

अपनी विकास मशीन पर, आप प्रोग्राम को निष्पादित कर सकते हैं और Sysinternals Process Explorer चला सकते हैं । निचले फलक में, यह आपको लोड किए गए DLL और वर्तमान रास्तों को दिखाएगा जो कि कई कारणों से आसान है। यदि आप अपने परिनियोजन पैकेज को निष्पादित कर रहे हैं, तो यह प्रकट होगा कि कौन से DLL गलत पथ में संदर्भित हैं (अर्थात सही तरीके से पैक नहीं किए गए थे)।

वर्तमान में, हमारी कंपनी निर्भरता के पेड़ और आउटपुट को चलने के लिए विजुअल स्टूडियो इंस्टॉलर परियोजनाओं का उपयोग करती है, क्योंकि प्रोग्राम ढीली होती हैं। VS2013 में, यह अब एक एक्सटेंशन है: https://visualstudiogallery.msdn.microsoft.com/9abe329c-9bba-44a1-be59-0fbf6151054d । हम फिर इन ढीली फाइलों को एक अधिक व्यापक इंस्टॉलर में पैकेज करते हैं लेकिन कम से कम उस सेटअप को सभी डॉट नेट निर्भरताओं को प्रोजेक्ट करते हैं और उन्हें एक स्थान पर छोड़ देते हैं और जब चीजें गायब होती हैं तो आपको चेतावनी देते हैं।


2

पिछले (यानी WinXP दिनों) में, मैं DLL डिपेंडेंसी वॉकर (depend.exe) पर निर्भर / भरोसा करता था, लेकिन कई बार ऐसा होता है जब मैं अभी भी DLL समस्या (ओं) को निर्धारित करने में सक्षम नहीं होता। आदर्श रूप से, हम निरीक्षण द्वारा रनटाइम से पहले पता लगाना चाहते हैं, लेकिन अगर वह इसे हल नहीं करता है (या बहुत अधिक समय ले रहा है), तो आप http://blogs.msdn.com/ पर वर्णित "लोडर स्नैप" को सक्षम करने का प्रयास कर सकते हैं। b / junfeng / आर्काइव / 2006/11/20 / डिबगिंग-लोडलॉउंडर-असफलताएं ।aspx और https://msdn.microsoft.com/en-us/library/windows/hardware/ff556886(v=v885).aspx और कथित तौर पर उल्लिखित LoadLibrary विफल हो जाती है; GetLastError कोई मदद नहीं

चेतावनी: मैंने अपने विंडोज को पिछले दिनों में बेवकूफ बना दिया है, जिससे कि वह अपने घुटनों पर क्रॉल कर रहा है, आपको फोरवार्ड किया गया है।

यहां छवि विवरण दर्ज करें

नोट: "लोडर स्नैप" प्रति-प्रक्रिया है, इसलिए UI सक्षम नहीं रहेगा (cdb या glfags -i का उपयोग करें)


2

NDe पर जेसी द्वारा पहले से ही उल्लेख किया गया था (यदि आप .NET कोड का विश्लेषण करते हैं) लेकिन आपको यह समझाने में मदद करता है कि यह कैसे मदद कर सकता है।

क्या कोई प्रोग्राम / स्क्रिप्ट है जो DLL निर्भरता के लिए एक निष्पादन योग्य को स्कैन कर सकता है या इन oops स्थितियों को रोकने के लिए परीक्षण के लिए "स्वच्छ" DLL मुक्त वातावरण में प्रोग्राम निष्पादित कर सकता है?

ND निर्भर प्रोजेक्ट प्रॉपर्टीज़ पैनल में, आप यह परिभाषित कर सकते हैं कि (हरे रंग में) विश्लेषण करने के लिए एप्लिकेशन असेंबली क्या हैं और एनडीपीडी एप्लीकेशन लोगों द्वारा उपयोग की जाने वाली थर्ड-पार्टी असेंबली (नीले रंग में) का उपयोग करेंगे। निर्देशिकाओं की एक सूची जहां आवेदन और तीसरे पक्ष की विधानसभाओं को खोजना है।

एनडिपेंडेंट प्रोजेक्ट प्रॉपर्टीज एप्लीकेशन और थर्ड-पार्टी असेंबली

यदि इन निर्देशिकाओं में तृतीय-पक्ष असेंबली नहीं मिली है, तो यह त्रुटि मोड में होगी। उदाहरण के लिए यदि मैं .NET एफएक्स निर्देशिका को हटाता हूं तो मैं C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319देख सकता हूं कि .NET एफएक्स थर्ड-पार्टी असेंबली हल नहीं हुई हैं:

एनडिपेंडेंट प्रोजेक्ट प्रॉपर्टीज़ एप्लिकेशन और थर्ड-पार्टी असेंबली हल नहीं हुईं

डिस्क्लेमर: मैं एनडिपेंडेंट के लिए काम करता हूं


1

कृपया Google में "depend.exe" खोजें, इसे संभालने के लिए एक छोटी सी उपयोगिता है।


7
ध्यान दें कि निर्भरता वॉकर काफी दिनांकित है, और 64 बिट के साथ अच्छी तरह से सह-ऑप नहीं करता है। यह निश्चित रूप से सभी आश्रित डीएलएल को दिखाएगा, जो कि ओपी की तलाश कर रहा है, लेकिन यह भी शोर जोड़ता है - आप पाएंगे कि आप 32 बिट निष्पादन योग्य कुछ 64 बिट डीएलएस और इतने पर लापता हैं ... अफसोस की बात है, अभी भी कोई बेहतर नहीं है वैकल्पिक।
एर

@eran अब के बारे में क्या? क्या अब बेहतर विकल्प है? धन्यवाद।
निकोस

@ RestlessC0bra नहीं है कि मुझे पता है, लेकिन मैं पिछले 5 वर्षों से विंडोज विकास नहीं कर रहा हूँ। निर्भरता वॉकर निश्चित रूप से मर चुका है, और यह शर्म की बात है कि Microsoft ने इस उपयोगी टूल को अपडेट करने के लिए न तो परेशान किया और न ही इसके स्रोत को खोला ताकि अन्य लोग इसे जीवित रख सकें।
एर फॉन

1
@eran नहीं DW मृत नहीं है। जाहिर है यह अभी भी बड़े पैमाने पर उपयोग किया जाता है। कुछ अन्य उपकरण हैं, लेकिन डीडब्ल्यू शायद अभी भी सबसे अच्छा है।
निकोस

@ RestlessC0bra: निर्भरता वॉकर मर चुका है। यह 64-बिट मॉड्यूल के साथ कभी नहीं पकड़ा गया। यदि आप पर्याप्त रूप से करीब से देखते हैं, तो डिपेंडेंसी वॉकर के व्यापक उपयोग से स्टैक ओवरफ्लो प्रश्नों की ओर जाता है, यह पूछते हुए कि कुछ क्यों हो रहा है। हालांकि ऐसा कभी नहीं होता है। यह सिर्फ एक गलत नकारात्मक / सकारात्मक है। प्रोसेस मॉनिटर आपका पसंदीदा टूल होना चाहिए।
IInspectable

1

यदि आपके पास स्रोत कोड है, तो आप ndepend का उपयोग कर सकते हैं।

http://www.ndepend.com/

यह मूल्यपूर्ण है और निर्भरता का विश्लेषण करने की तुलना में बहुत अधिक है, इसलिए आप जो खोज रहे हैं उसके लिए ओवरकिल हो सकता है।


3
विशेष रूप से .NET के लिए एक उपकरण होने के नाते, क्या यह देशी छवियों के लिए निर्भरता का विश्लेषण करता है?
IInspectable

शायद नहीं, @IInspectable। मुझे नहीं लगता है कि .NET के पास ऐसा करने का एक तरीका है, सिवाय संभवतः पी-इनवोक का उपयोग करने के।
kayleeFrye_onDeck

@kayleeFrye_onDeck: आयात तालिकाओं को पढ़ने की फ़ाइलों को पढ़ने के लिए फोड़ा जाता है। .NET फाइलों को पढ़ सकता है।
IInspectable

हां! और फिर भी, ऐसा करने के लिए कोई .NET एपीआई नहीं है :( आप क्या सुझाव देते हैं? मैं वास्तव में एक .NET प्रोग्रामर नहीं हूं, बस कोई है जो इसका उपयोग करता है जब निचले स्तर के समाधान बाहर पैन नहीं करते हैं। निरीक्षण उपकरणों का एक अच्छा चयन है। बाहर, लेकिन विंडोज के लिए बहुत कम वितरित-अनुकूल हैं, अकेले तेजी से चलो ... मैं इसे उपयोग करने के लिए द्विपदीय की एक अज्ञात राशि का निरीक्षण करने के लिए उपयोग कर रहा था जब संकलित किए गए फ्रेमवर्क का पता लगाने के लिए, इसलिए मैं उनके साथ विशेष परम विज्ञापन के साथ इलाज कर सकता था- हो सकता है। मुझे इसका उपयोग करना पड़ सकता है LoadLibraryEx...
kayleeFrye_onDeck

1
@kayleeFrye_onDeck: मॉड्यूल के आयात तालिकाओं को पढ़ने के लिए या तो विंडोज एपीआई में कुछ भी नहीं है। आपको फ़ाइलों को पढ़ना होगा और सामग्री को पार्स करना होगा। देशी कोड और .NET के बीच कोई अंतर नहीं है। LoadLibraryExवहाँ मदद नहीं करता है।
IInspectable

0

पेडेप्स प्रोजेक्ट ( https://github.com/brechtsanders/pedeps ) में आपकी .exe (या .dll) फ़ाइल (फाइलों) के साथ-साथ उन सभी फाइलों को कॉपी करने के लिए एक कमांड लाइन टूल (कॉपीपेडेप्स) है। यदि आप उस सिस्टम पर करते हैं जहां एप्लिकेशन काम करता है, तो आपको इसे सभी निर्भरता DLL के साथ शिप करने में सक्षम होना चाहिए।


0

कृपया नीचे दिए गए लिंक से Microsoft से SysInternal टूलकिट देखें, https://docs.microsoft.com/en-us/sysinternals/downloads/process-explorer

डाउनलोड फ़ोल्डर को गोटो करें, "Procexp64.exe" को व्यवस्थापक विशेषाधिकार के रूप में खोलें। Open Find Menu-> "Find Handle or DLL" विकल्प या Ctrl + F शॉर्टकट तरीका।

यहां छवि विवरण दर्ज करें


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