Як змінити відладчик за замовчуванням, який буде використовувати операційна система при аварійному збої?
HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersion AeDebug
Якщо заглянути в розділ реєстру AeDebug, то можна побачити, що значення, яке введено для параметра Debugger, виглядає точно так само, як рядок, що передається в API-функцію wsprintf:
drwtsn32 - p. - e. - g
де - p - ідентифікатор (ID) процесу аварійного завершення, а - е - значення дескриптора події, за допомогою якого відладчик повинен просигналити, коли його цикл налагодження здобуде перше налагоджувальне подія виходу з потоку. Сигнал дескриптора події повідомляє операційній системі, що відладчик приєднаний успішно.
Якщо перевірка отладочной динамічної області включена, то додаток буде виконуватися трохи повільніше, тому що коли в додатку викликається функція HeapFree, то доводиться додатково перевіряти коректність "купи". У лістингу 4-1 показаний приклад програми, яка псує пам'ять. Якщо ця програма виконується під отладчиком, то неважко помітити, що функція DebugBreak викликається двічі (на першому ж виклику функції HeapFree). Нижче показаний висновок, за яким видно, що при роботі з heap-областю виникли деякі проблеми.
HEAP [Heaper. exe]: Heap block at 00441E98 modified at 00441EAA past
requested size of a
HEAP [Heaper. exe]: Invalid Address specified to
RtlFreeHeapt 440000, 441eaO)
Якщо ця програма виконується поза відладчика, то вона завершується без повідомлень про будь-які проблеми.
Heap - "купа", область динамічно розподіляє пам'яті. - Пер.
Що цілком можливо, тому що не тільки отладчики, але і будь-які додатки можуть викликати функцію HeapCreate. - Пер.
Цей набір інструментів ви можете знайти на супроводжує CD. - Пер.
Це завантажувальний модуль, частиною якого є функція, показана в лістингу 4-1. - Пер.
Багато опції кнопок System Registry і Kernel Mode перемикача Destination вікна Global Flags є глобальними. Потрібно виявляти особливу обережність при їх установці, тому що вони можуть вплинути на продуктивність системи. Установка перемикача Destination в положення Image File Options набагато безпечніше, бо все установки впливають лише на один модуль (ім'я якого зазначено в сусідньому полі Image File Name).
// Створити heap-область операційної системи.
HANDLE hHeap = HeapCreate (0, 128, 0);
// Розподілити пам'ять для блоку розміром в 10 байтів.
LPVOID pMem = HeapAlloc (hHeap, 0,10);
// Записати 12 байт в 10-байтовий блок (переповнення heap-області).
memset (pMem, OxAC,
// Розподілити новий блок розміром 20 байт.
LPVOID pMem2 = HeapAlloc (hHeap, 0, 20);
// Записати 1 байт до другого блоку.
char * pUnder = (char *) ((DWORD) pMem2 - 1);
// Звільнити перший блок. Це звернення до HeapFree буде
// ініціювати точку переривання в коді отладочной heap-області
HeapFree (hHeap, 0, pMem);
// Звільнити другий блок. Зауважимо, що цей виклик не буде
// видавати соообщенія про неполадку
HeapFree (hHeap, 0, pMem2);
// Звільнити фіктивний блок. Зауважимо, що цей виклик не буде
// видавати повідомлення про неполадку
HeapFree (hHeap, О, (LPVOID) Oxl); HeapDestroy (hHeap);
Якщо встановити ті ж прапорці, що на рис.4.1, і повторити виконання HEAPER. EXE, то буде отриманий наступний, більш багатослівний висновок:
PAGEHEAP: process 0x490 created debug heap 00430000
(Flags 0xl, 50, 25, 0, 0)
PAGEHEAP: process 0x490 created debug heap 00CF0000
(Flags Oxl, 50, 25, 0, - 0)
PAGEHEAP: process 0x490 created debug heap 01600000
(Flags Oxl, 50, 25, 0, 0)
PAGEHEAP: Tail fill corruption detected:
Allocation at 0x01606FF0
Requested size 0x0000000A
Allocated size 0x00000010
Corruption at Ox01606FFA
PAGEHEAP: Attempt to reference block which is not allocated
Вміст лістингу пояснюють назви прапорців, встановлених панеллю Global Flags.