Dependency Walker

Dependency Walker по-русски

Назначение Dependency Walker

Dependency Walker – это искатель неисправностей и даже более того. Dependency Walker позволяет проследить, какие файлы загружаются и откуда, почему приложение не загружается и многое другое, т.е. проследить то, что происходит при загрузке. Dependency Walker просматривает все зависимые модули, нужные при загрузке приложения. При этом Dependency Walker выявляет недостающие файлы, поврежденные файлы, проверяет соотвествие между экпортируемыми функциями и теми, которые вызываются приложением. Dependency Walker определяет возможные ошибки инициализации модулей.

Кроме того Dependency Walker даёт детальную информацию о каждом модуле приложения, взаимодействии между модулями, дает перечень экспортируемых модулем функций, сообщить, какие из этих функций фактически вызываются, каие файлы нужны для загрузки данного модуля.

Скачать бесплатно Dependency Walker всегда можно с сайта www.dependencywalker.com.

Как модули зависят друг от друга?

Модули зависят друг от друга так:

  • Неявная зависимость (Implicit Dependancy). Её еще называют зависимостью времени загрузки. Пусть модуль А неявно связывается с модулем Б во время компиляции, и модуль А фактически вызывает функции из модуля Б. Значит модуль Б есть неявная зависимость модуля А, модуль Б будет загружен в память независимо от того, будут ли функции модуля Б фактически вызваны при работе приложения. Модуль Б будет указан в таблице импорта модуля А.
  • Зависимость с задержкой загрузки (отсроченная) (Delay-load Dependancy). Пусть модуль А связывается с задержкой с модулем Б во время компиляции, и модуль А фактически вызывает функции из модуля Б. Модуль Б будет загружет только при явном вызове его методов из модуля А при работе приложения. Модуль Б будет указан в таблице импорта с задержкой загрузки модуля А.
  • Опережающая зависиЗависимость с задержкой загрузки (отсроченная) (Delay-load Dependancy). Пусть модуль А связывается с задержкой с модулем Б во время компиляции, и модуль А фактически вызывает функции из модуля Б. Модуль Б будет загружет только при явном вызове его методов из модуля А при работе приложения. Модуль Б будет указан в таблице импорта с задержкой загрузки модуля А.
  • Явная зависимость (Explicit Dependancy). Её еще называют зависимостью времени исполнения или динамической зависимостью. Здесь модуль А не линкуется с модулем Б. Во время исполнения модуль А явно загружает модуль Б посредством LoadLibrary. Модуль Б не будет указан в таблицах импорта модуля А.
  • Системная зависимость (System Hook Dependancy). Пример: если кликнуть мышкой во время работы приложения, то операционная система создаст модуль и введёт его в процесс приложения для обработки события.

Динамические зависимости

Для определения какие модули загружаются при работе приложения используют Application Profiling, т.е. просмотр параметров приложения при его работе. Слово «profile» имеет ряд переводов и, в том числе, «совокупность параметров». Профиль приложения — это совокупность параметров приложения. Application Profiling показывает профиль приложения, например: какие модули динамически загружаются, какие не прошли инициализацию и т.п.

Профилированию подвергаются выполнимые файлы, обычно «.exe». Динамическую загрузку модулей можно наблюдать только в процессе работы приложения, а неявную, с здержкой, опережающую зависимости можно видеть сразу после того, как приложение будет открыто в Dependency Walker.

Для выявления всех загружаемых модулей следует проверять работу приложения под разными сценариями. Ведь определенные модули загружаются только при определенных обстоятельствах, например: при печати, при возникновении ошибки. Вот почему следут продумать сценарии исследования приложения.

Как оценивать выявленные ошибки и предупреждения?

Большинство ошибок можно отнести к двум категориям: ошибки времени загрузки и ошибки времени исполнения.

Ошибка загрузки означает, что операционная система не может загрузить все требуемые модули или не найдены требуемые функции. Ошибки загрузки возникают и при попытке загрузить поврежденный файл, не Windows модуль, модуль для иного типа процессора, 16-битный модуль в 32-битное приложение. Ошибки загрузки часто сразу вывляются Dependency Walker-ом при открытии файла.

Ошибки времени исполнения могут возникать при загрузке новых модулей уже после запуска приложения. Приложение может обращаться к методам в этих модулях и если возникнут проблемы, Dependency Walker заметит их. Но, если приложение имеет обработчик таких ошибок, Dependency Walker может пропустить их.

Есть ещё один тип предупреждений, на которые укажет Dependency Walker. Их зовут первым и вторым исключениями. При возникновении исключительной ситуации приложение получает возможность обработать его. Это называют исключением первого шанса. Если исключение будет обработано приложением, то Dependency Walker может проигнорировать его. Но если не обработает, то исключение первого шанса становится исключением второго шанса, которое приводит к аварийной остановке приложения. Dependency Walker регистрируе исключение второго шанса, хотя есть возможность для него указать и на первое.

Главное окно программы Dependency Walker

Главное окно программы Dependency Walker разбито на пять частей:

  • дерево объектов;
  • список уникальных модулей;
  • импортируемые функции;
  • экспортируемые функции;
  • журнал.

Dependency Walker

Все они имеют контекстные меню (клик правой кнопкой). Если установить курсор на объект и нажать F1, то получим справку по данному объекту.

Дерево объектов

Дерево объектов: Dependency Walker

Дерево объекиов представляет иерархические зависимости между модулями. Корневой элемент — это модуль, который мы выбрали для проверки. Такой модуль имеет таблицы импорта, по которым и строится дерево. Но и каждый модуль в этом дереве может иметь свои таблицы импорта, которые тоже просматриваются.

Если модуль представлен в дереве объетов более одного раза, то он отмечается значком с жирной черной стрелкой. Разворачивается такой модуль в дереве только один раз, и чтоб увидеть эту развертку вибираем в контестном меню «Highlight Original Instance Command». Модули с опережающая зависимость (Forwarded Dependency) отмечаются тонкой изогнутой стрелкой.

Модули с задержкой загрузки (отсроченная) (Delay-load Dependancy) отмечаются картинкой с песочными часами.

Динамические модули, а это явная зависимость (Explicit Dependancy), отмечают картинкой с солнцем.

Розовый фон пиктограмм – это предупреждение.

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

Красная пиктограмма указывает на ошибку.

Если в контекстном меню снять флаг «Auto Expand», то буде показан корневой элемент, его непосредственные зависимости и возможные ошибки.

Список уникальных модулей

Список уникальных модулей определяет набор файлов, необходимых для работы приложения, т.е. это перечень его зависимостей. Dependency Walker

Отличие этого окна от дерева объектов в том, что здесь представлены только уникальные модули, а в дереве объектов модули могут встречаться многократно. Значки в певом столбце аналогичны значкам в дереве объектов.

Импортируемые функции

Импортируемые модулем функции представлены в окне Dependency Walker

Красные значки укажут на ошибки.

Экспортируемые функции

Все экспортируемые модулем функции Dependency Walker

Синеватый фон указывает на функции, которые фактически вызываются в этой сессии.

Журнал

Журнал показывает сообщения о предупреждениях, ошибках и др. Dependency Walker

Как работать с Dependency Walker?

Открываем файл, который собираемся проверять: File — > Open. Далее, выбираем пункт меню Profile — > Start Profiling. Для завершения работы: Profile — > Stop Profiling.