【发布时间】:2010-09-24 08:48:59
【问题描述】:
我正在 WinXp VmWare 会话中编译一个 vc8 C++ 项目。在 RedHat VmWare 会话中,它比 gcc3.2 慢得多,所以我正在查看任务管理器。这就是说我的编译过程中有很大一部分花费在内核中。这对我来说听起来不对。
Win32 是否有 strace 的等价物?至少可以让我大致了解正在调用哪些内核函数。可能有一些东西是罪魁祸首。
【问题讨论】:
我正在 WinXp VmWare 会话中编译一个 vc8 C++ 项目。在 RedHat VmWare 会话中,它比 gcc3.2 慢得多,所以我正在查看任务管理器。这就是说我的编译过程中有很大一部分花费在内核中。这对我来说听起来不对。
Win32 是否有 strace 的等价物?至少可以让我大致了解正在调用哪些内核函数。可能有一些东西是罪魁祸首。
【问题讨论】:
不完全是 strace,但有一种方法可以查看内核调用堆栈,并且通过在 CPU 使用率高的时候对其进行采样,您通常可以估计一直在使用什么。
安装Process Explorer 并确保您使用符号服务器支持对其进行配置。你可以这样做:
这是符号路径的示例值:
SRV*C:\symbolcache*http://msdl.microsoft.com/download/symbols
(您可以将 _NT_SYMBOL_PATH 环境变量设置为相同的值,以使调试工具使用相同的符号服务器和缓存路径。)此路径将导致 dbghelp.dll 在被要求为模块提供符号时将符号下载到本地磁盘本地没有符号。
像这样设置 Process Explorer 后,您可以获取进程的属性,转到线程选项卡,然后双击最繁忙的线程。这将导致 Process Explorer 临时挂接到进程并扫描线程的堆栈,然后去查找堆栈上各种返回地址的符号。返回地址的符号和模块名称(对于非 MS 第三方驱动程序)应该为您提供有关 CPU 时间花费在何处的有力线索。
【讨论】:
Windows 资源工具包包含一个名为kernrate 的工具。这是一个采样分析器。它可以分析整个系统或特定进程。默认情况下,它的分辨率在模块级别,但可以调整到几个字节。默认分辨率应该没问题,因为您会看到哪些模块/驱动程序大部分时间都在消耗。
Here 是有关其使用的一些信息。
【讨论】:
VmWare 支持应该可以解决这个问题。它可能在 VmWare 实现中的某个地方。
您可以使用例如IrpTracker 让您了解内核中发生了什么。 另一种选择是使用内核调试器,即WinDbg。如果 cpu 负载非常高,只是在调试器中随机中断并查看调用堆栈可以让您知道谁是 cpu 负载背后的驱动程序。但正如我所说,我猜这将是一些 VmWare 组件。值得在没有仿真的情况下检查问题是否在 WinXP 上的同一台计算机上仍然存在。
【讨论】: