Dependency Walker

Dependency Walker по-українськи

Призначення Dependency Walker

Dependency Walker – це шукач несправностей і навіть більше того.

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

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

Завантажити Dependency Walker можна з сайту www.dependencywalker.com.

Наверх

Як модулі залежать один від одного?

Модулі залежать один від одного так:
1. Неявна залежність (Implicit Dependancy). Її ще називають залежністю часу завантаження. Нехай модуль А неявно пов'язується з модулем Б під час компіляції, і модуль А фактично викликає функції з модуля Б. Значить модуль Б є неявна залежність модуля А, модуль Б буде завантажений в пам'ять незалежно від того, чи будуть функції модуля Б фактично викликані при роботі додатки. Модуль Б буде вказаний в таблиці імпорту модуля А.
2. Залежність з затримкою завантаження (відстрочена) (Delay-load Dependancy). Нехай модуль А зв'язується з затримкою з модулем Б під час компіляції, і модуль А фактично викликає функції з модуля Б. Модуль Б буде загружет тільки при явному виклик його методів з модуля А при роботі програми. Модуль Б буде вказаний в таблиці імпорту з затримкою завантаження модуля А.
3. Випереджувальна завісіЗавісімость з затримкою завантаження (відстрочена) (Delay-load Dependancy). Нехай модуль А зв'язується з затримкою з модулем Б під час компіляції, і модуль А фактично викликає функції з модуля Б. Модуль Б буде загружет тільки при явному виклик його методів з модуля А при роботі програми. Модуль Б буде вказаний в таблиці імпорту з затримкою завантаження модуля А.
4. Явна залежність (Explicit Dependancy). Її ще називають залежністю часу виконання або динамічної залежністю. Тут модуль А чи не лінкуются з модулем Б. Під час виконання модуль А явно завантажує модуль Б допомогою LoadLibrary. Модуль Б не буде зазначений в таблицях імпорту модуля А.
5. Системна залежність (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 розбите на п'ять частин:

1. дерево об'єктів;
2. список унікальних модулів;
3. імпортовані функції;
4. експортовані функції;
5. журнал.
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.