налагодження dll

налагодження dll

Загальні принципи налагодження DLL

Хоча в вигляді DLL реалізуються найрізноманітніші об'єкти, існує 2 загальних принципу налагодження, які можна застосувати до всіх різновидів DLL.

Подальше налагодження DLL нічим принципово не відрізняється від налагодження додатків.

Іноді додаток, що використовує DLL, сама повинна запускатися ще одним додатком (саме така ситуація має місце з ISAPI-розширеннями, які завантажує сервіс IIS). В цьому випадку можна дотримуватися наступної тактики.

  1. Підключитися до додатка, використовуючи методики з попереднього розділу (в даному випадку виклик DebugBreak доведеться вставляти в код DLL). Якщо додаток продовжує виконання, зупинити його (Debug-> Break).
  2. Переконатися, що відладчик завантажив символи для DLL (у вікні Debug повинна з'явитися строчка виду "Loaded symbols for <имя DLL>"). Якщо цього не відбулося, слід додати отлаживаемую DLL в список Additional DLLs.
  3. Відкрити файли з вихідними текстами DLL (не відкриваючи її проекту!) І розставити необхідні точки зупину.
  4. Відновити виконання програми.

Налагодження розширень оболонки Windows

Для розширень оболонки Windows в якості отлаживаемого додатку вказується explorer.exe.

Закриття оболонки Windows

Оскільки в системі не можуть працювати дві оболонки одночасно (про винятки з цього правила ми поговоримо трохи пізніше), необхідно завершити оболонку Windows, перш ніж запускати нову з-під відладчика. Щоб завершити оболонку, потрібно:

  • Вибрати команду Start-> Shut Down.
  • Клацнути по кнопці No в розкрився діалозі, утримуючи клавіші Ctrl + Alt + Shift.

Повторний запуск оболонки

Для відновлення роботи оболонку після закінчення сеансу налагодження, досить запустити explorer.exe з будь-якої оболонки або з командного рядка. Якщо ні оболонки, ні командного рядка під рукою немає, можна використовувати такі прийоми.

  • Натиснути Ctrl + Alt + Del.
  • Викликати Task Manager.
  • Вибрати команду File-> New Task (Run) і запустити оболонку.
  • Зробити подвійне клацання по робочому столу. Відкриється діалогове вікно Task.
  • Вибрати команду File-> Run і запустити оболонку.

вивантаження DLL

У звичайному режимі роботи оболонка вивантажує DLL не відразу, а після закінчення певного проміжку часу. Це може перешкодити Лінкер перезаписувати файл DLL. Щоб оболонка вивантажувала DLL негайно, потрібно створити в реєстрі ключ HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ AlwaysUnloadDLL і записати "1" в його параметр за замовчуванням.

Налагодження Add-in'ов до Visual C ++

При налагодженні add-in'ов отладчику Visual C ++ доводиться налагоджувати самого себе. Найкраще встановити примірник середовища Visual C ++ без add-in'а, а потім використовувати цей екземпляр для налагодження. Інакше можливі вельми тонкі і неочевидні помилки, на виправлення яких піде багато часу. Інша можливість для налагодження add-in'ов - віддалена налагодження (про неї ми поговоримо в наступному розділі).

Налагодження ISAPI-розширень

Дані в цьому розділі належать до IIS5

ISAPI-розширення - це DLL, яка завантажується веб-сервером IIS для обробки запитів. Залежно від налаштувань захисту веб-додатки (application protection) вони можуть завантажуватися як головним файлом IIS inetinfo.exe (режим Low (IIS Process)), так і окремим процесом dllhost.exe (режими Medium (Pooled) і High (Isolated)) . Трохи пізніше ми побачимо, як налагоджувати ISAPI-розширення в тому і в іншому випадку. Але спочатку кілька слів про підготовку розширення до налагодження.

Підготовка до налагодження

Перш ніж починати налагодження, рекомендується виконати наступні кроки.

  1. Побудувати отладочную версію розширення.
  2. Створити для нього віртуальну директорію з дозволом на виконання (execute). Для створення віртуальної директорії використовується утиліта Internet Services Manager (Запустити її можна з меню Start-> Administrative Tools). Можна дати їй будь-яке ім'я (наприклад, test). Як фізичного шляху до директорії слід вказати шлях до Отладочная каталогу DLL розширення (наприклад, C: \ Projects \ MyISAPI \ Debug).
  3. Відключити кешування розширень веб-сервером. За замовчуванням DLL розширення завантажується сервером, як тільки приходить перший запит до неї, а потім залишається в пам'яті, щоб наступні запити оброблялися швидше. Це розумний підхід, але в налагоджувальних цілях краще відключити кешування, щоб DLL вивантажувалася відразу після обробки запиту. Для цього запустіть Internet Services Manager, викличте з контекстного меню веб-сайту діалог властивостей, перейдіть на закладку Home Directory. натисніть на кнопку Configuration. і зніміть прапорець Cache ISAPI applications.

Якщо веб-сервер ще не запущений, запустіть його. Після цього можна переходити безпосередньо до налагодження.

У процесі налагодження ISAPI-розширень досить часто доводиться запускати і зупиняти веб-сервер. Для цього можна використовувати команди net start w3svc і net stop w3svc відповідно. При бажанні можна додати ці команди в меню Tools. щоб вони завжди були під рукою.

Налагодження розширення в режимі in-process

В цьому режимі DLL завантажується процесом inetinfo.exe. Щоб до нього приєднатися, можна використовувати будь-яку з описаних в попередньому розділі методик (команду Attach To Process. Команду Debug в Task Manager або функцію DebugBreak. Яку в даному випадку слід вставити в GetExtensionVersion розширення). Після цього можна діяти за сценарієм, описаним в підрозділі "Загальні принципи налагодження", щоб завантажити налагоджувальні символи (якщо це необхідно) і розставити крапки зупинки.

Запуск IIS в режимі звичайного додатки

Якщо обсяг налагодження великий, і часто доводиться запускати і зупиняти сервіс, простіше запускати IIS з відладчика, як звичайне додаток.

Налагодження розширення в режимі out-of-process

В цьому режимі DLL завантажується процесом dllhost.exe. Процес налагодження для нього нічим принципово не відрізняється від попереднього випадку. Пам'ятайте тільки, що метод підключення до процесу за допомогою DebugBreak не працюватиме, тому що виключення EXCEPTION_BREAKPOINT буде перехоплено всередині dllhost.exe.

В системі може бути кілька процесів з ім'ям dllhost.exe. Необхідно з'ясувати, який з них завантажує DLL-розширення. Зробити це можна різними способами. Один з можливих варіантів - вставити в саму DLL код, який повідомляє ідентифікатор процесу, в який вона завантажена. наприклад:

Зверніть увагу на прапор MB_SERVICE_NOTIFICATION. Він необхідний, щоб повідомлення з ISAPI-розширення було видно на екрані.