Как проверить зависимость от DLL?


167

Иногда, когда я делаю небольшой проект, я не достаточно осторожен и случайно добавляю зависимость для DLL, о которой я не знаю. Когда я отправляю эту программу другу или другим людям, «она не работает», потому что отсутствует «какая-то DLL». Это, конечно, потому что программа может найти DLL в моей системе, но не в их.

Есть ли способ проверить исполняемый файл на наличие зависимостей DLL или выполнить программу в «чистой» среде, свободной от DLL, для тестирования, чтобы предотвратить возникновение таких проблем ?


2
Отладчик показывает каждую DLL, которая загружается в окне вывода. Модули Debug + Windows + показывают их список. Будьте уверены, что вы можете объяснить все из них. И тестируйте ваш установщик так же, как вы тестируете свой код, используйте виртуальную машину.
Ганс Пассант

@Hans Passant: Могу ли я где-нибудь найти полный список стандартных библиотек Windows?
orlp

Да, в c: \ windows \ system32 с авторским правом Microsoft.
Ганс Пассант

2
@orlp - Вы также можете попробовать dumpbin /dependents <program>. Я предполагаю, что список будет более релевантным, чем перечисление всех DLL в %SYSTEM%или %SYSTEM32%. Также см. Параметры DUMPBIN на MSDN.
17

Ответы:


106

Попробуйте Dependency Walker(последнее обновление в 2006 году) или современный переписать его под названием Dependencies.


20
Я читал, что это сейчас датировано, есть что-нибудь более актуальное?
TankorSmash

6
Если возможно, я буду доверять только исходному поставщику ОС, поскольку ddl-зависимость должна быть задачей ОС. Может ли какая-либо служебная программа Microsoft сделать это? Командная строка подходит для меня.
Робин Сюй

3
@RobinHsu: DependencyWalker раньше поставлялся с Visual Studio до Visual Studio 2005. Самая последняя сборка включена в комплект для разработки драйверов Windows (и не доступна на официальном веб-сайте). До сих пор официально не является инструментом Microsoft, но санкционирован, продвигается и рекламируется Microsoft.
января


8
Теперь есть переписывание с открытым исходным кодом, частично выполненное в C #, встречайте " Dependencies.exe ": github.com/lucasg/Dependencies . Тестовое впечатление: немного бета-версия , но она, очевидно, обрабатывает наборы API и SxS (отсутствует в Dependency Walker).
Штейн Осмул

219

dumpbin Инструменты Visual Studio (папка VC \ bin) могут помочь здесь:

dumpbin /dependents your_dll_file.dll

7
Удобный маленький инструмент, и избавляет от необходимости устанавливать что-то новое, когда у вас уже установлена ​​VS.
Джеймс

13
Да, dumpbin.exeочень полезно разобраться /dependentsи /imports. Вы также можете использовать его на других компьютерах, если копируете link.exeвместе с ним и убедитесь, что на целевом компьютере доступен соответствующий распространяемый пакет времени выполнения Visual C ++ x86 ( msvcr120.dllдля Visual Studio 2013) . Некоторые параметры имеют дополнительные зависимости. - Между прочим, они облажались с опцией названия, она должна была быть, /PREREQUISITESа не /DEPENDENTSдолжна была изучать латынь.
Луми

2
Это замечательно, мы добавили это в нашу систему сборки в качестве шага проверки, когда генерируется окончательный исполняемый файл, поэтому мы не зависим от того, что не включено в поставку.
Лотар

4
Единственный недостаток - этот удобный инструмент очень скрыт: c: \ Program Files (x86) \ Microsoft Visual Studio \ 2017 \ Community \ VC \ Tools \ MSVC \ 14.14.26428 \ bin \ Hostx64 \ x64> dumpbin
rkachach

1
@rkachach Если вы откроете командную строку Visual Studio (Инструменты -> Командная строка Visual Studio), она будет распознана как внешняя команда, и вам нужно всего лишь набрать «dumpbin».
Bemipefe

46

Я могу порекомендовать интересное решение для поклонников Linux. После изучения этого решения я переключился с DependencyWalker на этот.

Вы можете использовать свой любимый по lddсравнению с Windows exe,dll .

Для этого вам нужно установить Cygwin (базовая установка, без дополнительных пакетов) в Windows, а затем просто запустить Cygwin Terminal. Теперь вы можете запускать ваши любимые команды Linux, в том числе:

$ ldd your_dll_file.dll

UPD: Вы можете использовать lddтакже через терминал git bash в Windows . Нет необходимости устанавливать cygwin в случае, если у вас уже установлен git.


Я только что установил cygwin и был рад найти команды обратно linux, но я не смог выйти из корня Cygwin для доступа к другим файлам на моем локальном диске (C :). Это нормально?
ThomasGuenet

1
Я думаю, что это могло бы помочь вам: stackoverflow.com/questions/1850920/…
troyane

4
К сожалению, есть некоторая зависимость, которые не найден следующим образом: $ ldd ./Debug/helloworld.exe ??? => ??? (0x77d60000). Утилита dumpbin показывает все зависимости правильно.
fgiraldeau

5
Я использую ldd через терминал GIT BASH на Windows и работает нормально. Так что если у вас есть 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_nolapack.dll ntdll.dll => /c/WINDOWS/SYSTEM32/ntdll.dll (0x7ffe46910000) KERNEL32.DLL => /c/WINDOWS/System32/KERNEL32.DLL (0x7ffe46610000) KERNELBASE.dll => / c / WINDOWS / System32 / KERNEL. dll (0x7ffe42d40000) msvcrt.dll => /c/WINDOWS/System32/msvcrt.dll (0x7ffe44120000)
Борислав Марков

1
Как тот, у кого уже был установлен git bash, это было предпочтительным решением. Спасибо!
Николас

28
  1. Определите полный путь к файлу сборки, с которой вы пытаетесь работать

  2. Нажмите кнопку запуска, введите «dev». Запустите программу под названием «Командная строка разработчика для VS 2017»

  3. В открывшемся окне введите dumpbin /dependents [path], где [path]это путь , который вы выяснили в шаге 1

  4. нажмите клавишу ввода

Бэм, у тебя есть информация о зависимости. Окно должно выглядеть так:

введите описание изображения здесь

Обновление для VS 2019: вам нужен этот пакет в вашей установке VS:введите описание изображения здесь


9
  1. Есть программа под названием «Зависит»
  2. Если у вас установлен cygwin, ничего проще, чем ldd file.exe

4
Инструмент называется Dependency Walker ; это исполняемый образ с именем зависит.exe .
января

7
Зависимость Уокер от. Его последний построенный в 2008 году!
Суббота

dependsне поддерживает наборы API, поэтому он бесполезен для Win7 +.
ivan_pozdeev

8

Самое безопасное - иметь чистую виртуальную машину, на которой вы можете протестировать свою программу. На каждой версии, которую вы хотите протестировать, восстановите ВМ к ее первоначальному чистому значению. Затем установите вашу программу, используя ее настройки, и посмотрите, работает ли она.

У длл проблем есть разные лица. Если вы используете Visual Studio и динамически связываетесь с CRT, вы должны распространять библиотеки DLL CRT. Обновите ваш VS, и вам придется распространять другую версию CRT. Недостаточно просто проверить зависимости, так как вы можете их пропустить. Выполнение полной установки на чистой машине - единственное безопасное решение, IMO.

Если вы не хотите настраивать полнофункциональную тестовую среду и использовать Windows 7, вы можете использовать XP-Mode в качестве начальной чистой машины и XP-More для дублирования виртуальной машины.


6

На компьютере разработчика вы можете запустить программу и запустить Sysinternals Process Explorer . В нижней панели он покажет вам загруженные библиотеки DLL и текущие пути к ним, что удобно по ряду причин. Если вы выполняете пакет развертывания, он показывает, какие библиотеки DLL указаны по неправильному пути (т. Е. Неправильно упакованы).

В настоящее время наша компания использует проекты установщика Visual Studio для обхода дерева зависимостей и вывода в виде свободных файлов программы. В VS2013 теперь это расширение: https://visualstudiogallery.msdn.microsoft.com/9abe329c-9bba-44a1-be59-0fbf6151054d . Затем мы упаковываем эти свободные файлы в более полный установщик, но, по крайней мере, эта программа установки проецирует все зависимости точка-сеть и помещает их в одну точку и предупреждает вас, когда чего-то не хватает.


2

В прошлом (например, дни WinXP) я привык полагаться на DLL Dependency Walker (зависимость.exe) / полагаться на него, но бывают случаи, когда я все еще не могу определить проблему (и) DLL. В идеале мы хотели бы выяснить это до проверки времени выполнения, но если это не решает проблему (или занимает слишком много времени), вы можете попробовать включить «оснастку загрузчика», как описано на http://blogs.msdn.com/ b / junfeng / archive / 2006/11/20 / debugging-loadlibrary-failures.aspx и https://msdn.microsoft.com/en-us/library/windows/hardware/ff556886(v=vs.85).aspx и кратко упомянутое LoadLibrary терпит неудачу; GetLastError не помогает

ВНИМАНИЕ: Я в прошлом испортил свои Windows, дурачась с gflag, заставляя его ползти на колени, вы были предупреждены.

введите описание изображения здесь

Примечание. «Привязка к загрузчику» относится к каждому процессу, поэтому включение пользовательского интерфейса не будет проверяться (используйте cdb или glfags -i).


2

NDepend уже упоминался Джесси (если вы анализируете код .NET), но давайте объясним, как именно он может помочь.

Существует ли программа / сценарий, который может сканировать исполняемый файл на наличие зависимостей DLL или выполнить программу в «чистой» среде, свободной от DLL, для тестирования, чтобы предотвратить возникновение таких проблем?

На панели «Свойства проекта NDepend» вы можете определить, какие сборки приложения будут анализироваться (зеленым цветом), а NDepend выведет сборки сторонних производителей, используемые приложениями (синим цветом). Предоставляется список каталогов, в которых можно искать приложения и сторонние сборки.

NDepend Свойства проекта Приложение и сторонние сборки

Если сторонняя сборка не найдена в этих каталогах, она будет в режиме ошибки. Например, если я удаляю каталог .NET Fx, C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319я вижу, что сторонние сборки .NET Fx не разрешаются:

NDepend Свойства проекта Приложения и сторонние сборки не разрешены

Отказ от ответственности: я работаю на NDepend


1

Пожалуйста, поищите в файле google.exe, это небольшая утилита, чтобы справиться с этим.


7
Обратите внимание, что средство обхода зависимостей довольно устарело и не совместимо с 64-разрядными. Он определенно покажет все зависимые библиотеки DLL, что и ищет OP, но также добавляет шум - вы обнаружите, что у вас 32-битный исполняемый файл, в котором отсутствуют некоторые 64-битные библиотеки DLL и т. Д. К сожалению, лучше нет альтернатива.
Эран

@eran Как насчет сейчас? Есть ли лучшая альтернатива сейчас? Спасибо.
Никос

@ RestlessC0bra Не то, что я знаю, но я не занимался разработкой Windows в течение последних 5 лет. Обходчик зависимости наверняка мертв, и жаль, что Microsoft не удосужилась обновить этот полезный инструмент и не открыла его источник, чтобы другие могли его сохранить.
Эран

1
@eran No DW не умерла. По-видимому, он все еще широко используется. Есть и другие инструменты, но DW все еще, вероятно, лучший.
Никос

@ RestlessC0bra: Зависимость Уокер мертв. Он никогда не догонял 64-битные модули. Если вы присмотритесь достаточно внимательно, то интенсивное использование Dependency Walker приводит к вопросам переполнения стека, спрашивающим, почему что-то происходит. Это что-то никогда не случается, хотя. Это просто ложный негатив / позитив. Process Monitor должен быть вашим предпочтительным инструментом.
Инспектируемое

1

Если у вас есть исходный код, вы можете использовать ndepend.

http://www.ndepend.com/

Это дорого и делает гораздо больше, чем анализ зависимостей, так что это может быть излишним для того, что вы ищете.


3
Являясь инструментом, специально разработанным для .NET, анализирует ли он также зависимости для нативных изображений?
января

Наверное, нет, @IInspectable. Я не думаю, что у .NET есть способ сделать это, кроме, возможно, использования чего-то P-Invoke.
kayleeFrye_onDeck

@kayleeFrye_onDeck: анализ таблиц импорта сводится к чтению файлов. .NET может читать файлы.
IInspectable

Ага! И все же, .NET API для этого не существует :( Что вы предлагаете? Я не программист .NET, а просто тот, кто использует его, когда решения более низкого уровня не работают. Приличный выбор инструментов проверки там, но очень немногие для Windows удобны для распространения, не говоря уже о быстром ... Я искал возможность использовать его для рекурсивной проверки неизвестного количества двоичных файлов для обнаружения платформ, используемых при компиляции, чтобы я мог обрабатывать их с помощью специальных параметров hoc. Мне, возможно, придется посмотреть на использование LoadLibraryEx...
kayleeFrye_onDeck

1
@kayleeFrye_onDeck: В Windows API нет ничего, что бы считывало таблицы импорта модулей. Вы должны прочитать файлы и разобрать содержимое. Нет разницы между нативным кодом и .NET. LoadLibraryExне помогает там
Инспектируемое

0

Проект pedeps ( https://github.com/brechtsanders/pedeps ) имеет инструмент командной строки (copypedeps) для копирования ваших файлов .exe (или .dll) вместе со всеми файлами, от которых он зависит. Если вы сделаете это в системе, в которой работает приложение, вы сможете отправить его со всеми библиотеками зависимостей.


0

Пожалуйста, обратитесь к инструментарию SysInternal от Microsoft по ссылке ниже, https://docs.microsoft.com/en-us/sysinternals/downloads/process-explorer

Перейдите в папку загрузки, откройте «Procexp64.exe» с правами администратора. Откройте меню «Найти» -> «Найти дескриптор или DLL» или комбинацию клавиш Ctrl + F.

введите описание изображения здесь


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.