Jak sprawdzić zależność DLL?

165

Czasami, gdy robię mały projekt, nie jestem wystarczająco ostrożny i przypadkowo dodaję zależność dla biblioteki DLL, której nie jestem świadomy. Kiedy wysyłam ten program do znajomego lub innej osoby, „nie działa”, ponieważ brakuje „jakiejś biblioteki DLL”. Dzieje się tak, ponieważ program może znaleźć bibliotekę DLL w moim systemie, ale nie w swoim.

Czy istnieje sposób na przeskanowanie pliku wykonywalnego pod kątem zależności DLL lub uruchomienie programu w „czystym” środowisku wolnym od DLL w celu przetestowania, aby zapobiec takim sytuacjom oops ?

orlp
źródło
2
Debuger pokazuje każdą bibliotekę DLL, która jest ładowana w oknie danych wyjściowych. Lista modułów Debug + Windows + wyświetla ich listę. Upewnij się, że potrafisz uwzględnić je wszystkie. I przetestuj swój instalator, tak jak testujesz swój kod, użyj maszyny wirtualnej.
Hans Passant,
@ Hans Passant: Czy mogę gdzieś znaleźć pełną listę standardowych bibliotek DLL systemu Windows?
orlp
Tak, w c: \ windows \ system32 z prawami autorskimi firmy Microsoft.
Hans Passant
2
@orlp - Możesz też spróbować dumpbin /dependents <program>. Domyślam się, że lista będzie bardziej odpowiednia niż lista wszystkich bibliotek DLL w %SYSTEM%lub %SYSTEM32%. Zobacz także opcje DUMPBIN w witrynie MSDN.
jww

Odpowiedzi:

104

Wypróbuj Dependency Walker(ostatnia aktualizacja w 2006 r.) Lub jego nowoczesne przepisanie o nazwie Dependencies.

Luchian Grigore
źródło
20
Czytałem, że to jest teraz przestarzałe, czy jest coś bardziej aktualnego?
TankorSmash
6
Jeśli to możliwe, będę ufał tylko pierwotnemu dostawcy systemu operacyjnego, ponieważ zależność ddl powinna być zadaniem systemu operacyjnego. Czy jakikolwiek program narzędziowy firmy Microsoft może to zrobić? Linia poleceń jest dla mnie w porządku.
Robin Hsu
3
@RobinHsu: DependencyWalker był dostarczany z Visual Studio do wersji Visual Studio 2005. Najnowsza kompilacja jest dołączona do zestawu Windows Driver Development Kit (i nie jest dostępna w oficjalnej witrynie internetowej). Wciąż nie jest oficjalnie narzędziem firmy Microsoft, ale jest sankcjonowane, promowane i reklamowane przez firmę Microsoft.
Niespodziewane
8
Jest teraz przepisywanie oprogramowania typu open source, częściowo wykonane w C #, zobacz „ Dependencies.exe ”: github.com/lucasg/Dependencies . Wrażenie testowe: trochę beta-ish , ale najwyraźniej obsługuje zestawy API i SxS (brak w Dependency Walker).
Stein Åsmul
217

dumpbin z narzędzi programu Visual Studio (folder VC \ bin) mogą tu pomóc:

dumpbin /dependents your_dll_file.dll
JeffRSon
źródło
7
Poręczne małe narzędzie i oszczędza konieczności instalowania czegokolwiek nowego, gdy masz już zainstalowany VS.
James
13
Tak, dumpbin.exejest bardzo przydatne, aby dowiedzieć się /dependentsi /imports. Możesz go również używać na innych maszynach, jeśli kopiujesz link.exerazem z nim i upewnij się, że odpowiedni pakiet redystrybucyjny środowiska uruchomieniowego Visual C ++ x86 ( msvcr120.dlldla programu Visual Studio 2013) jest dostępny na komputerze docelowym. Niektóre opcje mają dodatkowe zależności. - Nawiasem mówiąc, schrzanili nazwę opcji, powinna /PREREQUISITESraczej być niż /DEPENDENTSpowinni byli uczyć się łaciny.
Lumi,
2
To wspaniale, dodaliśmy to do naszego systemu kompilacji jako krok weryfikacji podczas generowania końcowego pliku wykonywalnego, abyśmy nie polegali na czymś, co nie jest zawarte w dostawie.
Lothar
4
Jedyną wadą jest to, że to przydatne narzędzie jest bardzo ukryte: c: \ Program Files (x86) \ Microsoft Visual Studio \ 2017 \ Community \ VC \ Tools \ MSVC \ 14.14.26428 \ bin \ Hostx64 \ x64> dumpbin
rkachach
1
@rkachach Jeśli otworzysz wiersz poleceń programu Visual Studio (Narzędzia -> Wiersz polecenia programu Visual Studio), zostanie to rozpoznane jako polecenie zewnętrzne i wystarczy wpisać „dumpbin”.
Bemipefe
45

Mogę polecić ciekawe rozwiązanie dla fanów Linuksa. Po zbadaniu tego rozwiązania przeszedłem z DependencyWalker na to.

Można użyć ulubionego lddnad związane z systemem Windows exe, dll.

Aby to zrobić, musisz zainstalować Cygwin (podstawowa instalacja, bez dodatkowych pakietów wymaganych) w systemie Windows, a następnie po prostu zacząć Cygwin Terminal. Teraz możesz uruchamiać swoje ulubione polecenia systemu Linux, w tym:

$ ldd your_dll_file.dll

UPD: Możesz lddrównież użyć terminala git bash w systemie Windows . Nie ma potrzeby instalowania cygwin w przypadku, gdy masz już zainstalowany git.

troyane
źródło
Właśnie zainstalowałem cygwin i byłem szczęśliwy, mogąc znaleźć polecenia z powrotem linux, ale nie mogłem wyjść z katalogu głównego Cygwin, aby uzyskać dostęp do innych plików na moim dysku lokalnym (C :). Czy to normalne?
ThomasGuenet
1
Myślę, że to mogłoby ci pomóc: stackoverflow.com/questions/1850920/…
troyane
4
Niestety, istnieją pewne zależności, które nie znajdują się w następujący sposób: $ ldd ./Debug/helloworld.exe ??? => ??? (0x77d60000). Narzędzie dumpbin pokazuje poprawnie wszystkie zależności.
fgiraldeau
5
Używam ldd przez terminal GIT BASH w systemie Windows i działa dobrze. Więc jeśli masz git, będzie to łatwe, nie ma potrzeby instalowania cygwin. Przykład: 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_nolapack.dll ntdll.dll => /c/WINDOWS/SYSTEM32/ntdll.dll (0x7ffe46910000) KERNEL32.DLL => /c/WINDOWS/System32/KERNEL32.DLL (0x7ffe46610000) KERNELBASE.dll => / c / WINDOWS / System32 / KERNELBASE. dll (0x7ffe42d40000) msvcrt.dll => /c/WINDOWS/System32/msvcrt.dll (0x7ffe44120000)
Borislav Markov
1
Jako ktoś, kto już zainstalował git bash, było to preferowane rozwiązanie. Dziękuję Ci!
Nicolas
28
  1. Ustal pełną ścieżkę do zestawu, z którym próbujesz pracować

  2. Naciśnij przycisk Start, wpisz „dev”. Uruchom program o nazwie „Developer Command Prompt for VS 2017”

  3. W oknie, które zostanie otwarte, wpisz dumpbin /dependents [path], gdzie [path]jest ścieżka, którą odkryłeś w kroku 1

  4. naciśnij klawisz Enter

Bam, masz informacje o swojej zależności. Okno powinno wyglądać następująco:

wprowadź opis obrazu tutaj

Aktualizacja dla VS 2019: ten pakiet jest potrzebny w instalacji VS:wprowadź opis obrazu tutaj

Iamsodarncool
źródło
9
  1. Jest program o nazwie „Zależy”
  2. Jeśli masz zainstalowany cygwin, nic prostszego niż ldd file.exe
Artem
źródło
4
Narzędzie nazywa się Dependency Walker ; jego plik wykonywalny nazywa się depend.exe .
Niespodziewane
7
Dependency Walker jest przestarzały. Jego ostatnia budowa to 2008!
SuB
dependsnie obsługuje zestawów API, więc jest bezużyteczny dla Win7 +.
ivan_pozdeev
8

Najbezpieczniej jest mieć czystą maszynę wirtualną, na której możesz przetestować swój program. W każdej wersji, którą chcesz przetestować, przywróć maszynę wirtualną do jej początkowej czystej wartości. Następnie zainstaluj program, używając jego konfiguracji i sprawdź, czy działa.

Problemy DLL mają różne oblicza. Jeśli używasz programu Visual Studio i dynamicznie łączysz się z CRT, musisz rozpowszechniać biblioteki DLL CRT. Zaktualizuj swój VS, a będziesz musiał rozprowadzać inną wersję CRT. Samo sprawdzenie zależności nie wystarczy, ponieważ możesz je przegapić. Wykonanie pełnej instalacji na czystej maszynie jest jedynym bezpiecznym rozwiązaniem, IMO.

Jeśli nie chcesz konfigurować pełnego środowiska testowego i masz Windows 7, możesz użyć trybu XP jako początkowej czystej maszyny i XP-More, aby zduplikować maszynę wirtualną.

eran
źródło
6

Na komputerze deweloperskim możesz uruchomić program i uruchomić Sysinternals Process Explorer . W dolnym okienku pokaże załadowane biblioteki DLL i bieżące ścieżki do nich, co jest przydatne z wielu powodów. Jeśli wykonujesz poza pakietem wdrożeniowym, ujawni się, do których bibliotek DLL odwołuje się niewłaściwa ścieżka (tj. Nie zostały prawidłowo zapakowane).

Obecnie nasza firma korzysta z projektów Instalatora Visual Studio, aby przejść po drzewie zależności i wyprowadzić jako luźne pliki programu. W VS2013 jest to teraz rozszerzenie: https://visualstudiogallery.msdn.microsoft.com/9abe329c-9bba-44a1-be59-0fbf6151054d . Następnie pakujemy te luźne pliki w bardziej wszechstronny instalator, ale przynajmniej ten konfigurator projektuje wszystkie zależności dot net i umieszcza je w jednym miejscu i ostrzega, gdy czegoś brakuje.

Shiv
źródło
2

W przeszłości (tj. Dni WinXP), polegałem / polegałem na DLL Dependency Walker (depend.exe), ale są chwile, kiedy nadal nie jestem w stanie określić problemu (ów) DLL. Najlepiej byłoby się tego dowiedzieć przed uruchomieniem poprzez inspekcje, ale jeśli to nie rozwiąże problemu (lub zajmie zbyt dużo czasu), możesz spróbować włączyć „przystawkę modułu ładującego”, jak opisano na http://blogs.msdn.com/ b / junfeng / archive / 2006/11/20 / debugging-loadlibrary-failures.aspx i https://msdn.microsoft.com/en-us/library/windows/hardware/ff556886(v=vs.85).aspx i krótko wspomniano, że LoadLibrary zawodzi; GetLastError bez pomocy

OSTRZEŻENIE: Zepsułem mój Windows w przeszłości wygłupiając się z gflag, który czołgał się na kolana, zostałeś ostrzeżony.

wprowadź opis obrazu tutaj

Uwaga: „Snap modułu ładującego” jest zależny od procesu, więc włączenie interfejsu użytkownika nie pozostanie sprawdzone (użyj cdb lub glfags -i)

HidekiAI
źródło
2

Jesse wspomniał już o NDepend (jeśli analizujesz kod .NET), ale wyjaśnijmy dokładnie, jak może pomóc.

Czy istnieje program / skrypt, który może skanować plik wykonywalny w poszukiwaniu zależności DLL lub uruchamiać program w „czystym” środowisku wolnym od DLL w celu przetestowania, aby zapobiec takim sytuacjom oops?

W panelu Właściwości projektu NDepend możesz zdefiniować, jakie zestawy aplikacji mają być analizowane (na zielono), a NDepend będzie wywnioskować zestawy innych firm używane przez zespoły aplikacji (na niebiesko). Podana jest lista katalogów, w których można wyszukiwać aplikacje i zestawy innych firm.

NDepend Project Properties Aplikacja i zespoły innych firm

Jeśli zestaw innej firmy nie zostanie znaleziony w tych katalogach, będzie w trybie błędu. Na przykład, jeśli usunę katalog .NET Fx C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319, widzę, że zestawy innych firm .NET Fx nie są rozwiązane:

NDepend Project Properties Aplikacja i zespoły innych firm nie zostały rozwiązane

Uwaga: pracuję dla NDepend

Patrick z zespołu NDepend
źródło
1

Wyszukaj w google „depends.exe”, jest to małe narzędzie do obsługi tego problemu.

shiying yu
źródło
7
Zauważ, że Dependency Walker jest dość przestarzały i nie współpracuje dobrze z 64-bitowym. Ostatecznie pokaże wszystkie zależne biblioteki DLL, których szuka OP, ale dodaje również szum - zobaczysz, że w 32-bitowym pliku wykonywalnym brakuje niektórych 64-bitowych bibliotek DLL i tak dalej ... Niestety, nadal nie ma lepszego alternatywny.
eran
@eran A co teraz? Czy jest teraz lepsza alternatywa? Dzięki.
Nikos
@ RestlessC0bra Nie o tym wiem, ale nie zajmowałem się programowaniem dla systemu Windows od 5 lat. Dependency Walker na pewno jest martwy i szkoda, że ​​Microsoft nie zadał sobie trudu, aby zaktualizować to przydatne narzędzie, ani nie otworzył jego źródła, aby inni mogli go utrzymać przy życiu.
eran
1
@eran No DW nie jest martwy. Najwyraźniej nadal jest szeroko używany. Jest kilka innych narzędzi, ale DW jest prawdopodobnie najlepszy.
Nikos
@ RestlessC0bra: Dependency Walker nie żyje. Nigdy nie dogonił 64-bitowych modułów. Jeśli przyjrzysz się wystarczająco uważnie, wiele z tak szerokiego wykorzystania Dependency Walker prowadzi do pytań o przepełnienie stosu, pytając, dlaczego coś się dzieje. Jednak to coś nigdy się nie dzieje. To tylko fałszywie negatywny / pozytywny wynik. Process Monitor powinien być preferowanym narzędziem.
Inspectable
1

Jeśli masz kod źródłowy, możesz użyć ndepend.

http://www.ndepend.com/

Jest drogi i robi o wiele więcej niż analizowanie zależności, więc może to być przesada w przypadku tego, czego szukasz.

Jesse
źródło
3
Będąc narzędziem specjalnie dostosowanym do platformy .NET, czy analizuje również zależności dla obrazów natywnych?
Niespodziewane
Prawdopodobnie nie, @IInspectable. Nie sądzę, żeby .NET miał na to sposób, z wyjątkiem prawdopodobnie użycia czegoś P-Invoke.
kayleeFrye_onDeck
@kayleeFrye_onDeck: Analiza tabel importu sprowadza się do odczytu plików. .NET może czytać pliki.
Niespodziewane
Tak! A jednak nie ma do tego interfejsu API .NET :( Co sugerujesz? Nie jestem programistą .NET, tylko kimś, kto używa go, gdy rozwiązania niższego poziomu nie działają. Jest przyzwoity wybór narzędzi do inspekcji tam, ale bardzo niewiele dla Windows jest przyjaznych dla dystrybucji, nie mówiąc już o szybkich ... Chciałem go użyć do rekurencyjnej inspekcji nieznanej liczby plików binarnych w celu wykrycia frameworków używanych podczas kompilacji, więc mogłem traktować je specjalnymi parametrami ad- hoc. Może będę musiał przyjrzeć się używaniu LoadLibraryEx...
kayleeFrye_onDeck
1
@kayleeFrye_onDeck: W interfejsie API systemu Windows nie ma nic do odczytu tabel importu modułów. Musisz czytać pliki i analizować zawartość. Nie ma różnicy między kodem natywnym a .NET. LoadLibraryExtam nie pomaga.
Inspectable
0

Projekt Pedeps ( https://github.com/brechtsanders/pedeps ) ma narzędzie wiersza poleceń (copypedeps) do kopiowania plików .exe (lub .dll) wraz ze wszystkimi plikami, od których zależy. Jeśli zrobisz to w systemie, w którym działa aplikacja, powinieneś być w stanie dostarczyć ją ze wszystkimi zależnymi bibliotekami DLL.

Brecht Sanders
źródło