0

在使用heap_stat(一个基于 PYKD 库的 Python 脚本,用于在 Windbg 环境中运行 Python 脚本)时,我对这个脚本完成其工作所需的大量时间感到沮丧。

所以,我已经开始了一个分析会话,使用“非常困”,这给出了以下结果:

Name                        Exclusive  Inclusive  % Excl.    %Incl.   Module
RtlValidSecurityDescriptor   2561.56s   5123.12s   50.00%   100.00%    ntdll
ZwWaitForSingleObject        1280.78s   1280.78s   25.00%    25.00%    ntdll
NtUserWaitMessage            1279.73s   1279.73s   24.98%    24.98%   win32u

如您所见,大部分时间都花在一个函数上,检查一些有效性(我认为不需要)。有没有办法禁用此检查(Windows 配置、注册表设置……)?

在第一次评论后编辑
由于xperf请求分析,我执行了以下xperf命令:

开始分析:

xperf -start "DDS_LoggerName" -StackWalk ObjectCreate+ObjectDelete+ObjectReference -heap -Pids 28068

停止分析:

xperf -stop "DDS_LoggerName"

我已经使用 . 打开了结果(不完整,因为我首先想看看结果是什么样子)Windows Performance Analyzer,但这对我来说毫无意义。我相信我的xperf配置很糟糕。xperf为了能够测量哪个功能需要多少时间,我需要如何启动分析?

4

1 回答 1

1

我看到了你的 xperf 日志和结果:

25% CPU 调用 heap_output = dbgCommand('!heap -h 0').split('\n')

heap_output 中 heap_block 的 75% 循环:主要 CPU 使用者是 pykd.ptrPtr

CPU 丢失的主要原因是 Debug Engine 在内部大量调用 dbgeng!FlushCallbacks。事实上,所有调试引擎功能都会调用此方法,我不明白为什么。

我可以建议你重构 heap_stat.py 并用 ptrDword 或 ptrQword 重写你自己的 ptrPtr 函数,它可能会减少 CPU 损失。

于 2019-01-09T13:33:24.890 回答