Powershell中的线程的详细信息

时间:2014-01-26 23:22:55

标签: powershell windbg remote-server query-performance powershell-v4.0

如何通过powershell以类似于

的格式获取进程中运行的所有线程的CPU消耗

enter image description here

我运行gwmi win32_thread|select -First 1时找不到任何处理器信息。 Start Address是数字!?!

3 个答案:

答案 0 :(得分:2)

阿燕; 你看过Codeplex上的PowerDbg吗?

http://powerdbg.codeplex.com/

答案 1 :(得分:2)

显示与Process Explorer相同的详细信息

您提供的屏幕截图似乎是Process Explorer的屏幕截图,而不是任务管理器的屏幕截图。这会使事情变得更复杂,因为(如果我没记错的话)Process Explorer使用内核驱动程序来获取有关系统的详细信息,以便比Windows更精确地计算CPU时间。 我手边没有这本书,但这应该在Windows Sysinternals Administrator's Reference中进行描述。

将起始地址转换为DLL和方法

如名称所示,起始地址是一个地址。通常它会以十六进制格式显示,但实际上它只是一个数字,因此在您的情况下它可能是数字。转换为Hex是没问题的。

如果要将数字转换为有用的名称(如DLL名称和方法名称),则需要使用符号。请参阅截图:Process Explorer还需要下载符号,否则偏移量是从DLL开始计算的(如van.dll+1c904中所示)。

为了处理符号,Process Explorer使用名为dbghelp.dll的Microsoft DLL。您已在Options/Configure symbols...中对其进行了配置。如果您愿意,可以使用相同的DLL,但我会说这是您停止使用Powershell的地方,因为dbghelp.dll是本机DLL而不能被.NET使用。您甚至无法在Visual Studio中创建.NET互操作程序集,因为它不是COM DLL。

此外,Process Explorer将另一个魔法应用于起始地址的显示值:通常起始地址始终相同:某些Microsoft代码创建一个Thread对象,然后调用特定于应用程序的代码。 Process Explorer向上遍历堆栈跟踪并在调用堆栈上显示第一个非Microsoft框架。我不确定WMI所提供的地址是否也是一样的。

如果您想尝试dbghelp.dll,那么从地址转换为DLL的方法应为IDebugSymbols::GetNameByOffset()

另请注意,从地址到方法的转换需要在远程计算机上完成,因为只有远程计算机才能知道加载了哪个DLL的确切版本。然后,还要考虑远程计算机需要Internet访问才能从Microsoft服务器下载符号。

远程执行

在您提到的评论中,您希望在远程计算机上执行该命令。 Process Explorer不支持远程计算机。虽然我不确定原因,但我的猜测是它只能通过WMI访问远程PC - 因此会遇到与你相同的限制。

但是,有一些alternatives to Process Explorer, discussed in the Process Explorer Forum。他们似乎也受到WMI限制,但你可能会尝试一下。 除此之外,您还可以使用SysInternals PsExec在远程计算机上执行程序。

总体结论

我想预期的解决方案太复杂了,无法在StackOverflow上得到解答,特别是如果工具集仅限于Powershell。它至少需要C ++来集成dbghelp.dll以及PSExec来访问远程机器。

答案 2 :(得分:1)

不确定这是否可以使用PowerShell开箱即用,但由于您提供赏金,我建议您查看Process Hacker的源代码。

http://processhacker.sourceforge.net/

IIRC进程黑客是用C语言编写的,并且是完全开源的。

Clear the windows 7 standby memory programmatically