налагодження додатків
У цьому розділі ми перейдемо від теорії до практики і розглянемо деякі аспекти налагодження додатків.
Налагодження і фінальні версії
- Все неініціалізовані локальні змінні заповнюються значенням 0xCC. Звернення по неініціалізованих вказівником з таким значенням гарантовано призведе до порушення доступу. Програма буде припинена, і ви зможете побачити в отладчике точне місцезнаходження проблемної рядки.
- Значення покажчика стека при вході і виході з функції перевіряються на рівність. Розбіжність означає, що стек зіпсований (наприклад, через записи за кордон локального масиву), і програма видасть повідомлення про помилку.
- Значення покажчика стека до і після виклику функції також перевіряються на рівність. Якщо виявлено розбіжність, програма видає помилку. Завдяки цьому можна виявити помилки, пов'язані з викликом функції за вказівником, у якого може бути встановлений неправильно набір параметрів або угоду про виклик. Ось приклад такої помилки:
Деякі вважають, що після відключення оптимізації та генерації налагоджувальних символів фінальна версія нічим не відрізняється від отладочной. Це не так. По-перше, отладочная версія програми лінкуются налагоджування версією бібліотеки мови C, а фінальна версія - зі звичайною. По-друге, у фінальній версії не визначається макрос _DEBUG. що призводить до видалення з програми всіх діагностичних перевірок. Є й інші, менш помітні відмінності. Наприклад, у фінальній версії не відбувається ініціалізації змінних і областей пам'яті спеціальними налагоджувальними значеннями, типу 0xCD, 0xCC. Дана допомога компілятора виливається в те, що багато перевірки покажчиків змінних, що дають стабільний результат в налагоджувальної версії, призводять до нестабільності у фінальній версії.
Якщо помилка з'являється тільки при включеній оптимізації, її можна виправити одним з таких способів.
- Відмовитися від оптимізації, або включити її вибірково для окремих модулів. Можна також використовувати директиву #pragma optimize для тонкої настройки оптимізації в межах модуля.
- Переписати код іншим способом - можливо, в зміненому варіанті він буде скомпільовано і оптимізований без помилок.
Налагодження додатків, що запускаються іншими додатками
Якщо програму, яку потрібно налагодити, запускається з іншої програми (зокрема, це відноситься до локальних COM-серверів і сервісів Windows NT), завдання дещо ускладнюється. Необхідно підключити відладчик до отлаживаемому процесу до того, як в ньому виконається помилковий код. Для цього можна використовувати такі підходи.
Ручне підключення відладчика до процесу
Ви вже знаєте, що підключити відладчик до вже запущеного процесу можна двома способами: з Task manager'а або за допомогою команди Build-> Start Debug-> Attach to Process.
Недолік такого підходу полягає в тому, що від запуску процесу до приєднання відладчика проходить деякий час, за яке частина програми встигає виконатися. Це може бути якраз та частина, яка вас найбільше цікавить. В цьому випадку слід використовувати наступний метод.
Використання DebugBreak
Функцію DebugBreak можна використовувати, щоб перервати програму на самому початку її роботи, наприклад:
Виклик функції DebugBreak еквівалентний спрацьовування точки зупину. Якщо програма виконується без відладчика, точка зупинки нічим не відрізняється від будь-якого іншого виключення. Тому система припинить програму і видасть знайоме вікно Application Error (рис. 10).
Малюнок 10. Виняток типу Breakpoint
Автоматичне підключення відладчика до процесу
З параметром Debugger пов'язано одне неприємне обмеження: довжина шляху до отладчику не повинна перевищувати 64 символу. Шлях до каталогу, в який Visual C ++ ставиться за замовчуванням, зазвичай буває довше. В цьому випадку потрібно знайти спосіб записати шлях в більш компактній формі - наприклад, зробити каталог з Visual C ++ розділяються (shared) і задати в параметрі Debugger його мережеве ім'я.
Після цього додаток буде завжди запускатися під управлінням відладчика. Щоб відключити цей режим, видаліть з реєстру ключ, пов'язаний з вашим додатком
Що робити далі
Після того, як відладчик приєднаний до додатка, порядок дій може бути приблизно таким.
Файли з налагоджувальними символами повинні знаходитися в тому ж каталозі, що і програма, або ж в каталозі, в який їх спочатку помістив компілятор.
- Відкрийте файли з вихідними текстами програми (File-> Open) і розмістіть в потрібних місцях точки зупину.
- Відновіть роботу програми.
Після цього сеанс налагодження буде протікати, як зазвичай.
налагодження сервісів
DВсе сервіси Windows NT запускає Диспетчер управління службами (Service Control Manager, SCM). Приєднати відладчик до процесу сервісу можна як в момент його запуску, так і пізніше. Для цього можна використовувати методи, викладені в попередньому розділі. Проте, сервіси мають кілька особливостей, про які слід згадати.
Спрощений варіант налагодження
Так як будь-який сервіс є звичайним додатком Windows, в більшості випадків його можна запустити як будь-який інший виконуваний файл і налагоджувати в звичайному режимі. Для сервісів, створених за допомогою ATL Wizard, генерується код, який дозволяє зареєструвати цей сервіс не тільки в якості сервісу, але і в якості звичайного локального COM-сервера. При цьому стають доступними стандартні методи налагодження EXE-додатків. Такий режим не завжди підходить, так як додаток, що працює в режимі сервісу, має свої особливості.
Налагодження коду запуску
Режим Allow Service To Interact With Desktop
У процесі налагодження сервісу (як і будь-якого іншого застосування) зручно використовувати налагоджувальні макроси (такі, як _ASSERT) для перевірки різних умов по ходу програми. Щоб повідомлення від цих макросів могли з'являтися на екрані, необхідно відкрити властивості сервісу, перейти на закладку Log On, переконатися, що сервіс запускається під обліковим записом SYSTEM, і встановити прапорець Allow Service To Interact With Desktop. Коли сервіс повністю налагоджений, цей прапорець можна буде відключити.
Налагодження локальних COM-серверів
При налагодженні локальних COM-серверів зручно використовувати режим OLE RPC debugging. У цьому режимі можна "заходити" в отладчике прямо в методи COM-сервера (для цього "на льоту" запускається другий примірник відладчика і підключається до сервера). Режим OLE RPC debugging включається в вікні Tools-> Options (закладка Debug). Щоб він став доступний, необхідно попередньо включити режим Just-in-time debugging.