提高 PYKD heap_stat 性能,禁用 RtlValidSecurityDescriptor

Increase PYKD heap_stat performance, disabling RtlValidSecurityDescriptor

在使用 heap_stat(基于 PYKD 库的 Python 脚本,用于 Windbg 环境中的 运行 Python 脚本时,我对此脚本完成其工作需要大量时间。

所以,我使用“Very Sleepy”开始了一个分析会话,结果如下:

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 分析才能衡量哪个函数需要多少时间?

我看到了你的 xperf 日志,这里是你的结果:

25% CPU 接到电话 heap_output = dbgCommand('!heap -h 0').split('\n')

75% 循环 对于 heap_output 中的 heap_block: CPU 的主要消费者是 pykd.ptrPtr

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

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