如何以类似于此的格式获取通过 powershell 在进程中运行的所有线程的 CPU 消耗
运行时找不到任何处理器信息gwmi win32_thread|select -First 1
。而且Start Address
是数字!?!
如何以类似于此的格式获取通过 powershell 在进程中运行的所有线程的 CPU 消耗
运行时找不到任何处理器信息gwmi win32_thread|select -First 1
。而且Start Address
是数字!?!
显示与 Process Explorer 相同的详细信息
您提供的屏幕截图似乎是 Process Explorer 的屏幕截图,而不是任务管理器的屏幕截图。这使事情变得更加复杂,因为(如果我没记错的话)Process Explorer 使用内核驱动程序来获取有关系统的详细信息,以便比 Windows 更精确地计算 CPU 时间。我手头没有这本书,但这应该在Windows Sysinternals Administrator's Reference中描述。
将起始地址转换为 DLL 和方法
顾名思义,起始地址是一个地址。通常它会以十六进制格式显示,但实际上它只是一个数字,所以在你的情况下它可能是数字。转换为十六进制没有问题。
如果你想把数字变成有用的东西,比如 DLL 名称和方法名称,你需要使用符号。在您的屏幕截图中查看:Process Explorer 还需要下载符号,否则偏移量是从 DLL 开始计算的(如 中van.dll+1c904
)。
为了处理符号,Process Explorer 使用了一个名为dbghelp.dll
. 您已在Options/Configure symbols...
. 如果您愿意,您可以使用相同的 DLL,但我会说这是您停止使用 Powershell 的地方,因为dbghelp.dll
它是本机 DLL,不能被 .NET 使用。您甚至无法在 Visual Studio 中创建 .NET 互操作程序集,因为它不是 COM DLL。
此外,Process Explorer 对起始地址的显示值应用了另一种魔法:通常起始地址总是相同的:一些 Microsoft 代码创建一个 Thread 对象,然后调用应用程序特定的代码。Process Explorer 沿堆栈跟踪向上走,并在调用堆栈上显示第一个非 Microsoft 帧。我不确定WMI rturned 的地址是否考虑同样的事情。
如果您想dbghelp.dll
尝试一下,从地址转换为 DLL 的方法应该是IDebugSymbols::GetNameByOffset()。
另请注意,从地址到方法的转换需要在远程机器上完成,因为只有远程机器才能知道加载了哪个确切版本的 DLL。然后,还要考虑远程计算机需要 Internet 访问才能从 Microsoft 服务器下载符号。
远程执行
在您提到的评论中,您希望在远程计算机上执行该命令。Process Explorer 不支持远程机器。虽然我不确定原因,但我的猜测是它只能通过 WMI 访问远程 PC - 因此遇到与您相同的限制。
但是,Process Explorer 论坛中讨论了 Process Explorer 的一些替代方案。它们似乎也受到 WMI 限制的影响,但您可以尝试一下。除此之外,您可以使用SysInternals PsExec在远程机器上执行程序。
总体结论
我想预期的解决方案过于复杂,无法在 StackOverflow 上回答,尤其是在工具集仅限于 Powershell 的情况下。它至少需要 C++ 来集成和dbghelp.dll
访问PSExec
远程机器。
绫; 你看过 Codeplex 上的 PowerDbg 吗?
不确定这是否可以通过开箱即用的 powershell 完成,但由于您提供赏金,我建议您查看 Process Hacker 的源代码。
http://processhacker.sourceforge.net/
IIRC 进程黑客是用 C 语言编写的,并且是完全开源的。