WinDbg 分析 .NET Dump 线程锁问题

WinDbg 分析 .NET Dump 线程锁问题

💡 原文中文,约1300字,阅读约需3分钟。
📝

内容提要

使用 WinDbg 和 SOS 扩展分析 .NET 应用程序的高 CPU 占用时,首先加载 SOS.dll,查看高 CPU 占用线程及其调用栈,以识别忙线程、阻塞线程和 GC 线程。通过调用栈分析,判断是否因锁等因素导致异常 CPU 占用。掌握宏观视角、线程类型识别和深入分析技巧,有助于高效诊断问题。

🎯

关键要点

  • 使用 WinDbg 和 SOS 扩展分析 .NET 应用程序的高 CPU 占用问题。
  • 首先加载 SOS.dll,针对不同 .NET 版本使用不同的模块名。
  • 使用 !runaway 命令查看 CPU 占用高的线程。
  • 查看每个线程的调用栈是分析的关键,使用 ~* k 命令列出所有线程的原生调用堆栈。
  • 关注持续执行的线程、阻塞状态的线程和 GC 线程。
  • 分析具体线程时,使用 ~28s !clrstack 命令聚焦于特定线程的托管调用栈。
  • 总结时要宏观查看所有线程调用栈,识别忙线程、等待线程和 GC 线程。
  • 掌握这些分析技巧有助于高效诊断高 CPU 占用问题。

延伸问答

如何使用 WinDbg 分析 .NET 应用程序的高 CPU 占用问题?

首先加载 SOS.dll,然后使用 !runaway 命令查看高 CPU 占用线程,接着分析每个线程的调用栈,识别忙线程、阻塞线程和 GC 线程。

在 WinDbg 中如何加载 SOS 扩展?

使用 .loadby sos clr 命令加载 SOS.dll,具体模块名根据 .NET 版本不同而异。

如何识别高 CPU 占用的线程?

使用 !runaway 命令查看 CPU 占用高的线程,并通过 ~* k 命令列出所有线程的调用栈,关注持续执行的线程和阻塞状态的线程。

分析线程调用栈时需要关注哪些线程特征?

需要关注持续执行的线程、阻塞状态的线程和 GC 线程,特别是栈顶函数是否为业务逻辑方法或等待锁的函数。

如何进一步分析特定线程的托管调用栈?

使用 ~28s !clrstack 命令聚焦于特定线程,查看其托管调用栈以确认是否存在死循环或锁等待等问题。

在高 CPU 占用的排查中,应该掌握哪些关键点?

应宏观查看所有线程调用栈,识别忙线程、等待线程和 GC 线程,并使用 !clrstack 进一步分析托管调用栈。

➡️

继续阅读