如何从 umpdc.dll 调用的池标记 PdcA 中找到非分页池内存泄漏的根本原因?

如何从 umpdc.dll 调用的池标记 PdcA 中找到非分页池内存泄漏的根本原因?

我有一个非分页池内存泄漏,该泄漏持续增长,每秒分配约 80 次,每次 200 字节。因此,大约每秒 16kB 或每小时 58MB,每天 1.4GB。

我已经运行了poolmon.exe并按字节排序,可以看到池标记PdcA每5秒刷新一次,非分页内存发生一​​致的正变化,大约80,000字节。

我运行了 xperf 并在 Windows 性能分析器中分析了 pool.etl 文件,可以看到堆栈显示 umpdc.dll!PdcpAlpcCallback 负责增长,其影响大小与 poolmon.exe 中看到的增长率相匹配(参见附加的屏幕截图)。WPA 屏幕截图显示 10 秒内增加了 160kB

我还打开了任务管理器详细信息选项卡中的非分页内存列,看到与 audiodg.exe 关联的非分页内存约为 600 MB(poolmon.exe 显示与 PdcA 关联的非分页内存约为 6.5GB)。当我从任务管理器中终止 audiodg.exe 时,我看到 PdcA 非分页池字节有几 MB 的负变化,持续 80KB/5 秒的增长停止并变为 0,但 PdcA 中仍有大约 6.5GB 的内存未释放。

我确信重新启动将释放这 6.5GB,而且显然 audiodg.exe 是罪魁祸首,但我知道这是一个标准的 Windows 组件。pool.etl 中的调用堆栈没有显示任何具体的根本原因。它甚至没有显示 audiodg.exe,但我知道这是原因,因为终止该进程会立即停止内存增长。我猜 audiodg.exe 设置了正在执行的回调 (umpdc.dll!PdcpAlpcCallback)?如何才能找出哪些其他软件(如果有)触发 audiodg.exe 首先设置该回调?为什么 WPA 中的调用堆栈中没有显示更多信息?

我如何才能找到阻止这种情况继续的方法,而无需禁用 audiodg.exe 提供的 Windows 音频支持?除了即插即用的内置扬声器的 HDMI 显示器外,我没有连接任何音频设备。除了偶尔使用带有播放音频的视频的 Web 浏览器外,我没有运行任何音频专用软件。

我正在运行 Windows 10 版本 20H2 内部版本 19042.804

感谢您的帮助。

答案1

我找到了内存泄漏的原因。我仍然不知道如何系统地找到一般原因,但就我而言,我注意到,如果我在任务管理器的详细信息选项卡中查看 audiodg.exe 的总 CPU 时间,它与重新启动后启动的时间相同(即从启动开始不断使用 CPU),即使我还没有启动任何程序,甚至还没有登录到计算机。这让我想到要查看自动启动的启动程序。我注意到启动时启用了两个音频相关程序:Skype 和 Spotify。我从未使用过它们,甚至不知道我什么时候会安装它们,但它们无论如何都是启动程序的一部分。

我禁用了这两个程序的启动并重新启动了计算机,等待几分钟后,我看到 audiodg.exe 的 CPU 使用率为 0,非分页池只有 14K,并且没有增长。然后我在启动时重新启用了这两个程序并重新启动,发现在 audiodg.exe 启动几分钟后,CPU 和未分页内存就超过了 1MB。我不确定是哪一个问题,但我不需要它们,所以我卸载了这两个程序,从那时起,就没有看到 audiodg.exe 使用/泄漏内存的任何问题。如果它再次出现,我会再次发布,但如果没有,您可以假设它已经解决了。

我没有费心去诊断这两个应用程序中哪一个是问题所在,因为我不需要它们中的任何一个。

因此,从中可以学到的教训是,如果poolmon.exe和我最初帖子中提到的其他工具指出audiodg.exe存在问题,那么寻找任何使用音频的应用程序并尝试在不启用启动的情况下启动这些应用程序以查看问题是否像我的情况一样消失是有意义的。或者禁用所有启动应用程序,然后在重新启动之间一次重新启用一个应用程序,以查看哪个可能是问题所在。

更新:2021 年 5 月 13 日 我有点仓促地得出结论,认为通过删除 skype 和 spotify 可以解决问题。几天后,我再次看到同样的问题,并注意到登录时自动启动了另一个与音频相关的应用程序。 Thermaltake 灯光/风扇控制软件也设置为监控音频,以便同步灯光效果。我使用了自动运行适用于 Windows 的 Sysinternals 来弄清楚 Start_TTRGBPlus.bat 正在启动 TT RGB Plus.exe

禁用该应用程序的启动后,我现在已经有大约一周的稳定非分页内存,无需重新启动。

相关内容