Программно считывать количество ошибок на странице программы в Windows - PullRequest
3 голосов
/ 20 июня 2011

Я бы хотел, чтобы моя программа на Windows C ++ могла считывать количество ошибок, вызванных жесткими страницами.Программа не работает от имени администратора. Отредактировано, чтобы добавить: Для ясности, меня не так интересует общее количество сбоев страниц всей системы.

Похоже, что ETW может экспортировать счетчики для этого, но я 'У меня много трудностей с определением API, и неясно, что доступно обычным пользователям по сравнению с администраторами.

У кого-нибудь есть пример этой функциональности?Или это просто невозможно в Windows?

(ОТ, но разве не печально, насколько проще это сделать в * nix? Gerusage (), и все готово.)

Ответы [ 6 ]

4 голосов
/ 20 июня 2011

afai может сказать, что единственный способ сделать это - использовать ETW (Event Tracing для Windows) для мониторинга ошибок аппаратных страниц ядра. Полезная нагрузка события имеет идентификатор потока, который вы могли бы сопоставить с существующим процессом (это будет нетривиально, кстати) для получения текущего подсчета для каждого процесса. Я не вижу способа получить историческую информацию за процесс.

Я могу гарантировать вам, что это трудная проблема, потому что Process Explorer поддерживает только ошибки страницы (программные или жесткие) в отображении каждого процесса.

http://msdn.microsoft.com/en-us/magazine/ee412263.aspx

Ошибка страницы возникает при поиске Запись таблицы страниц недействительна. Если запрашиваемая страница должна быть внесена в с диска это называется жесткой страницей неисправность (очень дорогая операция), и все остальные типы считаются ошибки мягкой страницы (менее дорогой операция). Полезная нагрузка события сбоя страницы содержит адрес виртуальной памяти для которого произошла ошибка страницы и указатель инструкции, вызвавший Это. Ошибка жесткого диска требует диска доступ к происходящему, который может быть первый доступ к содержимому в файле или доступ к блокам памяти, которые были выгружен Включение событий сбоя страницы вызывает жесткую ошибку страницы, которая будет зарегистрирована как ошибка страницы с типом Hard Page Неисправность. Тем не менее, жесткая ошибка, как правило, оказывает значительно большее влияние на производительность, поэтому отдельное событие доступны только по грубой вине можно включить независимо. Жесткий Полезная нагрузка события сбоя имеет больше данных, такие как ключ файла, смещение и поток Идентификатор по сравнению с событием Page Fault.

2 голосов
/ 20 июня 2011

Я думаю, вы можете использовать GetProcessMemoryInfo () - обратитесь к http://msdn.microsoft.com/en-us/library/ms683219(v=vs.85).aspx для получения дополнительной информации.

1 голос
/ 21 июня 2011

На сайте Microsoft есть образец C / C ++, который объясняет, как читать счетчики производительности: INFO: Пример кода PDH для перечисления счетчиков производительности и экземпляров

Вы можете скопировать / вставить его, и я думаю, что вас интересуют счетчики «Память» / «Считывания страниц / сек», как указано в этой интересной статье: Основы ошибок страниц

1 голос
/ 20 июня 2011

Это делается с помощью счетчиков производительности в Windows. Я давно с ними ничего не делал. Я не помню, нужно ли вам работать от имени администратора, чтобы запрашивать их.

[Изменить] У меня нет примера кода для предоставления, но в соответствии с этой страницей , вы можете получить эту информацию для определенного процесса:

Процесс: сбои страниц / сек. Это указание номера страницы неисправности, возникшие из-за запросов из этого конкретного процесса. Чрезмерные ошибки страницы из конкретный процесс является показателем обычно плохой практики кодирования. Либо функций и DLL нет организовано правильно, или набор данных что приложение использует в настоящее время называется менее чем эффективным способ.

1 голос
/ 20 июня 2011

Да, довольно грустно.Или вы могли бы просто не предполагать, что Windows настолько проста, что даже не предоставляет счетчик ошибок страницы, и искать его: Win32_PerfFormattedData_PerfOS_Memory .

0 голосов
/ 21 июня 2011

Я не думаю, что вам нужны административные учетные данные для перечисления счетчиков производительности. Пример кода codeproject Счетчик производительности счетчиков

...