如何使用大量 CPU 快速获取线程的托管堆栈跟踪

Posted

技术标签:

【中文标题】如何使用大量 CPU 快速获取线程的托管堆栈跟踪【英文标题】:How to quickly get the managed stack trace of threads using lots of CPU 【发布时间】:2012-01-11 21:27:18 【问题描述】:

在诊断高 CPU 问题时,首先想到的问题是哪个线程正在使用所有 CPU 以及它在做什么(在托管代码术语中)?为了解决这个问题,例如需要安装 Process Explorer 来查找有问题的线程。然后需要捕获进程的转储,将其加载到诸如 windbg 之类的东西中并找出线程在做什么 - 找出每个线程的托管堆栈跟踪。

这个过程有点费时。是否有可以编写的工具(免费或付费)或可靠的代码,可以在几秒钟内完成所有这些(单击按钮)。我希望看到的最终结果是一个按 CPU 利用率排序的线程列表,以及它所在的当前方法,并且可以选择向下钻取以查看整个堆栈跟踪。基本上与您在 Process Explorer 中看到的内容相同,但托管代码除外。

这需要适用于 .NET 4.0。

【问题讨论】:

查看 Sam Saffron 的博客 - 他有一个 CPU 分析工具,当 CPU 变高时我们在 SE 使用:samsaffron.com/archive/2009/11/11/… msdn.microsoft.com/en-us/magazine/ee336027.aspx @HansPassant 如果我记得很清楚,它已集成到分析工具中,因此仅适用于非常高成本的 VS 版本。 知道它是哪些线程对您没有帮助。你需要一个 CPU 分析器。 【参考方案1】:

您可以构建自己的迷你分析器,例如 http://samsaffron.com/archive/2009/11/11/Diagnosing+runaway+CPU+in+a+Net+production+application

查看Diagnosing runaway CPU in a .Net production application

【讨论】:

以上是关于如何使用大量 CPU 快速获取线程的托管堆栈跟踪的主要内容,如果未能解决你的问题,请参考以下文章

导致 OOM 的线程的堆栈跟踪

获取 Java 线程 id 和失控 Java 线程的堆栈跟踪

在linux平台上用c/c++打印进程的所有线程堆栈跟踪

devenv.exe 和 svchost.exe 都占用了整个 CPU,并且占用的线程在堆栈跟踪的顶部具有相同的功能

生产环境如何快速跟踪分析定位问题-Java

如何使用 WinDBG 列出所有托管线程的调用堆栈?