8

我的系统遇到了高计时器分辨率(NtQueryTimerResolution返回 0.5 毫秒)。

Maximum timer interval: 15.600 ms
Minimum timer interval: 0.500 ms
Current timer interval: 0.500 ms

某些进程必须以NtSetTimerResolution5000 (0.5ms) 的值调用,但我如何确定是哪一个?我看到英特尔有一个名为Battery Life Analyzer的工具,可以显示每个进程的当前计时器分辨率,但该工具仅供英特尔合作伙伴使用。是否有其他工具或方法可以通过 WinDbg 查看它?注意:这似乎发生在启动时,因为设置断点不起作用(调试器启动时分辨率已经很高)。

4

3 回答 3

4

我发现 Windows 7 在 _EPROCESS 内核结构中跟踪每个进程的计时器分辨率。

启用调试(使用 启动/debug)后,可以使用 windbg (run ) 浏览 ExpTimerResolutionListHead 列表windbg -kl并提取定时器信息,如下所示:

lkd> !list "-e -x \"dt nt!_EPROCESS @$extret-@@(#FIELD_OFFSET(nt!_EPROCESS,TimerResolutionLink)) ImageFileName UniqueProcessId SmallestTimerResolution RequestedTimerResolution\" nt!ExpTimerResolutionListHead"

然而,在我的情况下,进程 ID 为 NULL(可能是因为驱动程序发出了请求),我仍然无法确定它是哪个驱动程序。

于 2014-05-20T11:02:06.370 回答
3

到目前为止,我知道并使用过的唯一方法是注入每个正在运行的进程,并在该进程内部调用timeEndPeriod这些分辨率的循环中的每个增加的分辨率(值 1-15),并检查timeEndPeriod对当前分辨率的调用是否返回TIMERR_NOCANDOTIMERR_NOERROR(注意:这些返回值不是对应的 false 和 true)。如果它返回TIMERR_NOERROR则断定程序正在使用该频率,然后再次调用timeBeginPeriod以恢复程序请求的原始分辨率。

不幸的是,这种方法没有检测到可以由未记录的NtSetTimerResolution函数设置的 0.5 ms 计时器分辨率。

如果您想持续监控新的计时器分辨率,那么NtSetTimerResolution在 ntdll.dll 中挂钩对未记录函数的调用是我目前使用的方式(例如,可以从这里获取函数的签名)。

不幸的是,挂钩不会检测到在安装挂钩之前请求的计时器分辨率,因此您需要将它与上述timeEndPeriod技巧结合起来,并注意挂钩之前的 0.5 毫秒分辨率请求不会被检测到。

我同意,这种方法看起来很麻烦。此外,它有点侵入性,因为它修改了进程的状态,并且还假设您能够注入所有进程。

如果有人有更好的方法,我也会有兴趣了解它们。

于 2014-05-20T03:34:42.483 回答
3

输入

您可以在管理 CMD 提示符中运行以下命令:

c:\temp> powercfg -energy duration 5

这将创建一个名为:C:\temp\energy-report.html

此报告将显示哪些进程更改了计算机上的时钟延迟/分辨率。通常这些是 RTC(实时通信)应用程序,但正如您所注意到的,可以是 Chrome 和其他应用程序。

输出

输出的一个(尽管是德语)示例如下所示。抱歉,我目前无法访问英语客户端。

报告中的第一个声明:有些事情发生了变化

平台-Zeitgeberauflösung:平台-Zeitgeberauflösung

Die standardmäßige Plattform-Zeitgeberauflösung beträgt 15,6 ms (15625000 ns) und sollte immer dann verwendet werden, wenn sich das System im Leerlauf befindet。Wenn die Zeitgeberauflösung erhöht wird, sind die Technologien zur Prozessorenergieverwaltung möglicherweise nicht wirksam。Die erhöhte Zeitgeberauflösung kann auf eine Multimediawiedergabe oder Grafikanimationen zurückzuführen sein。

当前设置 (100-ns-Einheiten) 10000 <<=== 当前设置
Maximale Zeitgeberperiode (100-ns-Einheiten) 156250 <<== 默认设置

报告中的第二个陈述:罪魁祸首

Platform-Zeitgeberauflösung:Ausstehende Zeitgeberanforderung

Von einem Programm oder Dienst wurde eine Zeitgeberauflösung angefordert, die kleiner als die maximale Zeitgeberauflösung der Plattform ist.

Angeforderter Zeitraum 10000 <<== Requested Clock Latency
ID des anfordernden Prozesses 12592 <<== 应用程序请求不同时钟延迟
Pfad des anfordernden Prozesses \Device\HarddiskVolume4\Program Files (x86)\C4B\XPhone Connect Client\C4B 的进程 ID。 XPhone.Commander.exe <<== 罪魁祸首

这些信息可以相互分离,并且可以在各个块之间包含不同的模块,但是您应该能够找到拥有上述信息的罪魁祸首。

于 2019-05-10T14:43:07.943 回答