Error reporting можна видалити. Розкриваючи таємниці Windows: як працює служба реєстрації помилок? Використання механізму Windows Error Reporting

Це стаття за мотивами питань на форумах: "Як мені повернути рядок з DLL?", "Як передати і повернути масив записів?", "Як передати в DLL форму?".

Щоб вам не витрачати половину життя на розібратися - в цій статті я принесу все на блюдечку.

Теми цієї статті в різному ступені вже не раз порушувалися в цьому блозі, але в цій статті вони зібрані в купу, наведені обґрунтування. Коротше, посиланням на цю статтю можна кидатися в тих, хто розробляє DLL.

важливе зауваження: статтю потрібно читати послідовно. Приклади коду наводяться тільки як приклади, На кожному кроці (пункті) статті код прикладів додається новими подробицями. Наприклад, на самому початку статті немає обробки помилок, вказуються "класичні" методи (типу, використання GetLastError, угоди sdtcall і т.д.), які по ходу статті замінюються на більш адекватні. Зроблено так з тієї причини, щоб "нові" ( "незвичайні") конструкції не викликали запитань. Інакше при довелося б до кожного наприклад вставляти примітка виду: "ось це обговорюється в тому пункті нижче, а ось те - в цьому ось". У будь-якому випадку в кінці статті є посилання на вже готовий код, написаний з урахуванням усього сказаного в статті. Можете просто його брати і використовувати. А стаття пояснює навіщо і чому. Якщо вам не цікаво "навіщо і чому" - перегортайте в кінець висновку і засланні на скачування прикладу.

Звіт про помилки включений за замовчуванням в XP, Vista, і Windows 7. Коли в додатку відбувається помилка з'являється детальний опис цієї помилки і вам пропонується відправити дану інформацію в Microsoft. Дана інформація виходить з мільйонів ПК в усьому світі і допомагає в створенні патчів і сервіс паків. У деяких випадках самостійний розбір інформації про помилки допомагає у вирішенні проблеми. Однак в деяких випадках ця поведінка системи не допустимо і вам хотілося б відключити даний функціонал. У даній статьте ми і розглянемо методи відключення звіту про помилки в усіх системах.

Windows 7

Відкрийте стартове меню і введіть в пошуковий рядок problem reporting settings, Або перейдіть в Action Center -> Change Action Center Settings -> Problem Reporting Settings. Якщо ви використовували метод пошуку, виберіть пункт "Choose how to report problems":

Потім ви можете легко вибрати потрібну вам опцію зі списку.

Відключення звіту про помилки в Windows 7 за допомогою групових політик

Зауваження: Даний метод недоступний для домашніх версій Windows 7.

Натисніть Start і введіть gpedit.mscв рядку пошуку і натисніть Enter.

Відкриється редактор локальної групової політики. Далі вам потрібно перейти в розділ User Configuration \ Administrative Templates \ Windows Components \ Windows Error Reporting і зайти в політику Disable Windows Error Reporting.

Змініть стан політики з Not Configured на Enabled, потім натисніть Apply і Ok і вийдіть з редактора групової політики.

Відключення звіту про помилки в Vista

Для відключення звіту про помилки в Vista натисніть на Start і відкрийте панель управління (Control Panel).

Переведіть панель управління в класичний режим відображення і натисніть на Problem Reports and Solutions.

Як ви можете бачити нам пропонується дві опції. Якщо ви виберете Ask me to check if a problem occurs, Звіт про помилки буде включений і вам буде запропонований вибір посилати інформацію в Microsoft чи ні. Якщо ви виберете Check for solutions automatically (recommended)всі дані будуть відправлятися в Microsoft автоматично. Обидва варіанти нам не підходять, так як ми хочемо повністю відключити даний функціонал, тому натиснемо посилання Advanced Settings.

У вікні в розділі For my programs, problem reporting is ...виберіть Off і потім натисніть Ok.

Як ви тепер бачите попередні опції недоступні для редагування.

Натисніть Close в повідомленні, що повідомляє нам про те, що звіт про помилки відключений.

Відключення звіту про помилки в XP

Для відключення звіту про помилки в XP натисніть правою кнопкою на іконці " Мій комп'ютер"І виберіть властивості. У вікні, перейдіть на вкладку додатковоі натисніть кнопку Звіт про помилки.

У вікні, виберіть опцію Disable error reporting. Зніміть прапорець з опції But notify me when critical error occur.

Задумалися де купити хорошу і недорогу одяг для дитини. Рекомендую дитячий сток інтернет-магазин з величезним вибором і низькими цінами.

У попередній статті даного циклу, присвяченій механізму Application Restart and Recovery, ми згадали механізм Windows Error Reporting (WER). Про нього і піде мова в цій статті даного циклу

У попередній статті даного циклу, присвяченій механізму Application Restart and Recovery, ми згадали механізм Windows Error Reporting (WER). Про нього і піде мова в цій статті даного циклу.

Механізм Windows Error Reporting

За допомогою механізму Windows Error Reporting (WER) можна збирати дані про помилки, що відбуваються в додатках, і або відсилати цю інформацію на спеціальний сайт Microsoft (сайт http://winqal.microsoft.com), або зберігати її локально. Збір детальної інформації про помилки та збої допомагає в усуненні недоліків додатків, корекції помилок, спрощує випуск пакетів оновлень і нових версій програм, забезпечує загальну стабільність і надійність як самих додатків, так і операційної системи.

Відзначимо, що компанія Microsoft сама активно використовує механізм Windows Error Reporting як в процесі розробки, так і після випуску товарів на ринок. Так, продуктова група Microsoft Office виправила 50% помилок в Office Service Pacl 2, продуктова група Visual Studio - 74% помилок в Beta 1 Visual Studio 2005, 29% помилок в Windows XP було виправлено в Windows XP Service Pack 1. В даний час більш 2 тис. компаній застосовують сервіси Windows Error Reporting для поліпшення якості своїх додатків.

Механізм Windows Error Reporting вперше з'явився в Windows XP, був істотно розширено в Windows Vista і отримав подальший розвиток в Windows Server 2008, Vista Service Pack 1 і Windows 7 і Windows Server 2008 R2. Так, на рівні Windows Vista у розробників з'явилася можливість не тільки отримувати інформацію про збої, що відбулися в додатках, але і дані про продуктивність. Тепер користувач може створювати, настроювати і відсилати звіти про проблеми, покращилися засоби онлайнового аналізу даних і спростився механізм комунікацій з користувачами - через механізм Problem Reports and Solutions(В Windows Vista - Start -> Control Panel -> System and Maintenance -> Problem Reports and Solutions -> View Problem History) і Action Center(В Windows 7). Потім в Windows Server 2008 і Vista Service Pack 1 з'явилася можливість створення локальних дампов, а в Windows 7 і Windows Server 2008 R2 додана можливість створення виключень, які не будуть оброблятися традиційними обработчиками і призводитимуть до негайного завершення програми та автоматичного запуску механізму Windows Error Reporting , а також можливість завдання зовнішнього процесу - обробника винятків, який буде викликатися для отримання назви події, параметрів звіту про помилку і опціонального запуску відладчика.

Використання механізму Windows Error Reporting

Давайте коротко розглянемо, як розробники можуть застосовувати механізм Windows Error Reporting для отримання інформації про збої та інші проблеми зі своїми додатками. Починаючи з Windows Vista Windows за замовчуванням надає звіт про збої, зависання і помилки рівня ядра операційної системи (kernel faults) для всіх додатків - внесення змін до коду додатків не потрібно. При необхідності звіт включає міні-дамп пам'яті і дамп «купи» додатка, додатків потрібне використання програмних інтерфейсів в тих випадках, коли необхідна відсилання какойто специфічної для додатка додаткової інформації. Оскільки ядро ​​Windows автоматично збирає в звіт інформацію про необроблених винятків, додатків не потрібно обробляти виключення, що призводять до фатальних помилок.

У разі виникнення збоїв, зависань або помилок рівня ядра операційної системи механізм Windows Error Reporting виконує наступну послідовність дій:

  1. Виникнення проблеми.
  2. Ядро операційної системи викликає WER.
  3. WER збирає дані, створює звіт і, при необхідності, може вимагати від користувача підтвердження на відсилання звіту.
  4. При отриманні підтвердження WER відсилає звіт в Microsoft (так званий Watson Server).
  5. Якщо файлу потрібне додаткові дані, WER збирає їх і, при необхідності, може вимагати від користувача підтвердження на відсилання.
  6. Якщо додаток зареєстровано для перезапуску (цю тему ми обговорювали раніше), то WER виконує відповідну побічно спричинюється функцію додатка.
  7. Якщо існує рішення проблеми, що призвела до збою, користувач отримує повідомлення за допомогою відповідних засобів операційної системи.

Залежно від ситуації в CAB-файлі можуть бути присутніми різні типи дампов, які можна розрізняти по розширенню імені файлу (табл. 1).

У додатку можуть використовуватися такі опції для настройки вмісту звіту, що посилається в Microsoft, - реєстраційна функція вказує Web на необхідність включення в створюваний звіт зазначених файлів і блоків пам'яті.

Для включення до складу звіту файлу застосовується функція WerRegisterFile (), якою в якості параметрів передаються: повне ім'я файлу, його тип (одне зі значень WER_REGISTER_FILE_TYPE) і два прапори: WER_DELETE_FILE_WHEN_DONE, який вказує на те, що файл повинен бути вилучений після відсилання звіту, і WER_ANONYMOUS_ DATA, який вказує на те, що в файлі не містяться приватні дані. Можливі значення параметра WER_REGISTER_FILE_ TYPE наведені в табл. 2.

Відзначимо, що завдання створення дампа пам'яті покладається на розробника програми - для її вирішення можна застосовувати, наприклад, налагодження механізми, описані в Windows SDK (див. Функцію MiniDumpWriteDump ()).

Для виключення файлу зі звіту слід використовувати функцію WerUnRegisterFile (), вказавши їй як параметр ім'я виключається файлу.

У більшості сценаріїв відсилання додаткових файлів відбувається тільки при отриманні від сервера відповідного запиту. У разі надсилання додаткових файлів необхідно застосовувати прапор WER_ADD_ REGISTERED_DATA при виконанні функції WerReportSubmit () - про неї ми розповімо далі.

Для включення до складу звіту копії області пам'яті застосовується функція WerRegisterMemoryBlock (), в якості параметрів якої передаються адреса початку включається блоку пам'яті і розмір цього блоку в байтах (максимальний розмір блоку пам'яті - WER_MAX_MEM_BLOCK_SIZE). Для скасування включення копії області пам'яті в звіт слід застосовувати функцію WerUnRegisterMemoryBlock (). У разі надсилання даних з пам'яті необхідно використовувати прапор WER_ADD_REGISTERED_DATA при виконанні функції WerReportSubmit ().

Функції WerSetFlags () і WerGetFlags () можуть застосовуватися відповідно для управління станом процесу в момент генерації звіту про помилки і отримання інформації про налаштування.

Процес генерації і відсилання звіту складається з декількох кроків. Ініціалізація звіту виконується викликом функції WerReportCreate (), за допомогою якої вказується тип події, для якого створюється звіт, тип звіту ( WerReportNonCritical- для збоїв з можливістю відновлення і WerReportCritical - для збоїв, які спричинили аварійне завершення програми), посилання на інформацію, що включається до звіту (див. Структуру WER_REPORT_INFORMATION), і змінна, яка буде містити посилання на створений звіт, - ReportHandle.

Після того як звіт успішно инициализирован, необхідно додати в нього параметри першої і другої груп. Параметри першої групи задаються за допомогою функції WerReport-Set-Parameter (), якою передається посилання на створений звіт (результат успішного виконання функції WerReportCreate), набір прапорів, ім'я параметра і його значення (16-бітна рядок в Unicode, що закінчується нулем).

Для включення до складу звіту додаткових параметрів застосовується функція WerReportAddSecondaryParameter (), якою передається посилання на звіт, ім'я параметра і його значення.

Крім можливості включення до складу звітів файлів і знімків областей пам'яті, передбачена передача в складі звіту і дампов пам'яті - для цього можна використовувати функцію WerReportAddDump (), в якості параметрів якої вказуються посилання на звіт, посилання на процес і потік, для яких був створений дамп , тип дампа (одне зі значень WER_DUMP_TYPE), інформація про виключення (покажчик на структуру типу WER_EXCEPTION_INFORMATION), додаткові опції (тип даних WER_DUMP_CUSTOM_OPTIONS) і прапори. Відзначимо, що процес, для якого створюється дамп, повинен мати права доступу STANDARD_RIGHTS_READ і PROCESS_QUERY_INFORMATION.

Для включення до складу звіту файлів ми застосовуємо функцію WerReportAddFile (), якою передаємо посилання на звіт, повне ім'я файлу, тип файлу (WER_FILE_ TYPE) і додаткові прапори.

Крім цього розробникам надається можливість настройки призначеного для користувача інтерфейсу - вибору інформації, яка відображається в системній діалогової панелі. Для цих цілей служить функція WerReportSetUI Option (), якою передається посилання на звіт, тип інтерфейсу звіту (WER_REPORT_UI) і значення відображається рядки. Додаток може модифікувати будь-яке з полів интерфейсного елемента, заданого параметром WER_REPORT_UI; кожен виклик функції дозволяє модифікувати тільки одне поле. Функція WerReportSetUIOption () може бути викликана в будь-який момент роботи програми до безпосередньої відсилання звіту.

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

Для відключення додатки від механізму Windows Error Reporting слід використовувати функцію WerAddExcludedApplication (), а для повторного підключення - функцію WerRemoveExcludedApplication ().

Налаштування Windows Error Reporting розташовуються в двох гілках реєстру:

  • HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ Windows Error Reporting;
  • HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Windows \ Windows Error Reporting.

Найбільш корисні настройки показані в табл. 3.

висновок

В даному циклі статей ми обговорили різні питання поліпшення стабільності роботи додатків. Ми розглянули техніку, що дозволяє уникнути витоку пам'яті, запобігти зависання додатків, обговорили використання механізму Application Restart and Recovery, що дозволяє перезапускати програми, які або заблокували якісь ресурси, або перестали реагувати на повідомлення системи, і механізму Windows Error Reporting, який дає можливість збирати дані про збої, що відбуваються в додатках.

У наступних статтях, присвячених операційній системі Windows 7 для розробників, ми розглянемо ряд змін на рівні ядра операційної системи, які можуть представляти інтерес для розробників додатків.

Перестає працювати або працює некоректно), Windowsстворює звіт про проблему, який призначений для відправки в Microsoft(Щоб відшукати рішення проблеми).

Починаючи з операційної системи , На зміну «інструменту аналізу збоїв або аварій» Dr. Watsonприйшла Windows Error Reporting (WER) – Служба реєстрації помилок Windows(Інші назви - , Звіти про проблеми і рішення).

Служба реєстрації помилок Windowsпредставлена ​​наступними файлами (всі розташовані в каталозі \ Windows \ System32 \):

wer.dll (Бібліотека повідомлень про помилки Windows);

wercon.exe (Звіти про проблеми і їх рішення);

wercplsupport.dll ();

werdiagcontroller.dll (WER Diagnostic Controller);

WerFault.exe (Звіт про помилки Windows);

WerFaultSecure.exe (Звіти про помилки Windows);

wermgr.exe (Windows Problem Reporting);

wersvc.dll (Служба реєстрації помилок Windows);

wertargets.wtl.

Коли відбувається збій будь-якого процесу (програми), служба Windows Error Reportingзапускає - в сеансі помилкового процесу - свою ( WerFault.exe),

передаючи ідентифікатор ( PID) Процесу в командний рядок WerFault:

При цьому відображається вікно Microsoft Windowsз повідомленням про помилку - «Припинена робота<Название_программы>. При наступному підключенні до Інтернету Windows може провести пошук способу усунення цієї помилки »:


При натисканні на кнопку Показати подробиці проблемиможна ознайомитися з сигнатурою проблеми:


Сигнатури проблем зберігаються в звітах про помилки, які зберігаються в каталозі \ Users \ Master \ AppData \ Local \ Microsoft \ Windows \ WER \ ReportArchive \, Кожен звіт - в окремій папці Report ********(Наприклад, Report0a003e48), у файлі Report.wer.

Зразкове вміст файлу Report.wer:

Version = 1

EventType = APPCRASH

EventTime = 129234418886148269

ReportType = 2

Consent = 1

Response.type = 4

Sig.Name = Ім'я програми

Sig.Value = iexplore.exe

Sig.Name = Версія додатка

Sig.Value = 8.0.6001.18928

Sig.Name = Штамп часу додатки

Sig.Value = 4bdfa327

Sig.Name = Ім'я модуля з помилкою

Sig.Value = mshtml.dll

Sig.Name = Версія модуля з помилкою

Sig.Value = 8.0.6001.18928

Sig.Name = Штамп часу модуля з помилкою

Sig.Value = 4bdfb76d

Sig.Name = Код винятку

Sig.Value = c0000005

Sig.Name = Зсув винятку

Sig.Value = 000da33f

DynamicSig.Name = Версія ОС

DynamicSig.Value = 6.0.6002.2.2.0.768.3

DynamicSig.Name = Код мови

DynamicSig.Value = 1049

DynamicSig.Name = Додаткові відомості 1

DynamicSig.Value = fd00

DynamicSig.Name = Додаткові відомості 2

DynamicSig.Name = Додаткові відомості 3

DynamicSig.Value = fd00

DynamicSig.Name = Додаткові відомості 4

DynamicSig.Value =

UI = C: \ Program Files \ Internet Explorer \ iexplore.exe

UI = Припинена робота Internet Explorer

UI = Windows може провести пошук способу усунення цієї помилки в Інтернеті.

UI = Шукати рішення проблеми в Інтернеті і закрити програму

UI = Перевірити наявність способу виправлення помилки в Інтернеті пізніше і закрити програму

UI = Закрити програму

FriendlyEventName = Зупинка роботи

ConsentKey = APPCRASH

AppName = Internet Explorer

AppPath = C: \ Program Files \ Internet Explorer \ iexplore.exe

Як запустити службу Звіти про проблеми і їх рішення

натисніть Пуск -> Панель управління -> Звіти про проблеми і їх рішення;


- у вікні Звіти про проблеми і їх рішенняу меню завданнядоступні наступні опції:

· Шукати нові рішення(Необхідно відкрите з'єднання з Інтернетом);

Сподобалася стаття? Поділіться з друзями!