如何调试缓慢的 Windows API 调用?

逆向工程 登录 接口 视窗 10
2021-07-08 13:30:04

我工作的机器最近从 Windows 7 更新到了 Windows 10,它变得非常慢。IT 部门在升级后安装了一系列用于安全和保护的新工具,但他们说问题不在于他们的工具。我一直在试图弄清楚发生了什么。我不是唯一遇到此问题的工程师,几乎所有 Windows 10 用户都遇到此问题。

我开始使用API Monitor监控一些已安装的程序,我注意到任何与磁盘 I/O 相关的系统调用都需要很长时间才能返回。我捕获应用程序的运行,然后解析摘要并尝试找到最热门的 API 调用。

我监控了我自己正在开发的程序,以下 API 调用占用了总时间的 70% 左右:

  • _wopen
  • CreateFileA
  • fgets
  • ReadFile

我认为这可能是与磁盘相关的问题,但在安全模式下,一切都按预期工作并且感觉很活泼。我在安全模式下测试了同一个应用程序,上面的 API 调用仍然是最热门的调用,但它们只占总运行时间的 5%。这让我相信问题不是磁盘,而是我机器上安装的其他一些服务,这些服务监视所有与磁盘 I/O 相关的 API 调用并使我的机器变慢。但是我不知道哪个应用程序干扰了 API 调用。

如何找出特定 API 调用花费如此多时间的原因?我可以进入 Windows 内核并调试此问题吗?

我希望这是这篇文章的正确位置。

1个回答

Windows 应用程序不能孤立地工作。他们必须与所有其他进程、服务、驱动程序等共享处理器。特定 API 调用缓慢的原因可能有很多,而且 API 本身不太可能有问题。特别是对于 I/O,需要考虑所有缓存、驱动程序和硬件本身(即 HDD/SSD)。要获得全局图片,您可以使用类似已经提到的xperf、Windows 自己的性能监视器,或者可能是围绕它们的漂亮的UIforETW GUI 包装器。

这是使用 ETW 调查 Windows 性能问题的一个很好的起点:https : //randomascii.wordpress.com/2015/09/24/etw-central/