【问题标题】:Finding out why a process is spending time in the kernel in win32在 win32 中找出进程在内核中花费时间的原因
【发布时间】:2010-09-24 08:48:59
【问题描述】:

我正在 WinXp VmWare 会话中编译一个 vc8 C++ 项目。在 RedHat VmWare 会话中,它比 gcc3.2 慢得多,所以我正在查看任务管理器。这就是说我的编译过程中有很大一部分花费在内核中。这对我来说听起来不对。

Win32 是否有 strace 的等价物?至少可以让我大致了解正在调用哪些内核函数。可能有一些东西是罪魁祸首。

【问题讨论】:

    标签: winapi profiling kernel


    【解决方案1】:

    不完全是 strace,但有一种方法可以查看内核调用堆栈,并且通过在 CPU 使用率高的时候对其进行采样,您通常可以估计一直在使用什么。

    安装Process Explorer 并确保您使用符号服务器支持对其进行配置。你可以这样做:

    1. 安装 WinDebug 以获取更新的 dbghelp.dll
    2. 通过在选项 | 中设置路径,将进程资源管理器设置为使用此版本的 dbghelp.dll。 Process Explorer 的配置符号菜单。
    3. 同样在同一个对话框中,设置符号路径,使其包括 MS 符号服务器和本地缓存。

    这是符号路径的示例值:

    SRV*C:\symbolcache*http://msdl.microsoft.com/download/symbols
    

    (您可以将 _NT_SYMBOL_PATH 环境变量设置为相同的值,以使调试工具使用相同的符号服务器和缓存路径。)此路径将导致 dbghelp.dll 在被要求为模块提供符号时将符号下载到本地磁盘本地没有符号。

    像这样设置 Process Explorer 后,您可以获取进程的属性,转到线程选项卡,然后双击最繁忙的线程。这将导致 Process Explorer 临时挂接到进程并扫描线程的堆栈,然后去查找堆栈上各种返回地址的符号。返回地址的符号和模块名称(对于非 MS 第三方驱动程序)应该为您提供有关 CPU 时间花费在何处的有力线索。

    【讨论】:

      【解决方案2】:

      Windows 资源工具包包含一个名为kernrate 的工具。这是一个采样分析器。它可以分析整个系统或特定进程。默认情况下,它的分辨率在模块级别,但可以调整到几个字节。默认分辨率应该没问题,因为您会看到哪些模块/驱动程序大部分时间都在消耗。

      Here 是有关其使用的一些信息。

      【讨论】:

      • Windows Driver Kit 中有更新版本的 kernrate。
      【解决方案3】:

      VmWare 支持应该可以解决这个问题。它可能在 VmWare 实现中的某个地方。

      您可以使用例如IrpTracker 让您了解内核中发生了什么。 另一种选择是使用内核调试器,即WinDbg。如果 cpu 负载非常高,只是在调试器中随机中断并查看调用堆栈可以让您知道谁是 cpu 负载背后的驱动程序。但正如我所说,我猜这将是一些 VmWare 组件。值得在没有仿真的情况下检查问题是否在 WinXP 上的同一台计算机上仍然存在。

      【讨论】:

      • 我不建议使用 WinDbg。 Process Explorer 自动转储running 应用程序的堆栈。它只需要来自 WinDbg 的 dbghelp.dll;它不使用其他任何东西。
      • 已更新。它是否也包括内核堆栈?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-03
      • 1970-01-01
      • 2014-03-29
      • 1970-01-01
      • 1970-01-01
      • 2011-08-30
      • 1970-01-01
      相关资源
      最近更新 更多