电话
400 9058 355
必须用 WinDbg Preview 或 WinDbg 10 分析 C# dump;.NET Framework 可用 WinDbg Legacy 配匹配版本 SOS.dll,.NET Core/5+ 必须用 WinDbg Preview 并通过 dotnet-sos 安装扩展,且位数需与 dump 一致。
必须用 WinDbg Preview(Microsoft Store 版)或 WinDbg 10(Windows SDK 自带),旧版 WinDbg Legacy 对 .NET Core/.NET 5+ 支持极差,连 clrstack 都可能报 Failed to load data access DLL。
关键点:
WinDbg Legacy + SOS.dll(路径需匹配运行时版本,如 C:\Windows\Microsoft.NET\Framework64\v4.0.30319\SOS.dll)WinDbg Preview,它内置 dotnet-sos 和自动扩展加载能力.loadby sos coreclr 失败不是所有 dump 都能直接敲 !clrstack。常见失败原因是 DAC(Data Access Component)没找到,尤其 .NET Core 程序的 dump 缺少运行时符号或未部署 dotnet-sos。
实操步骤:
.symfix; .reload 确保符号路径正确(默认走 Microsoft 服务器)dotnet-sos install(需已装 .NET SDK),然后在 WinDbg 中执行 .load C:\Users\XXX\.dotnet\sos\sos.dll
.loadby sos clr(托管进程)或 .loadby sos mscorwks(.NET 2.0)!eeversion 应输出运行时版本;!dumpheap -stat 不报错即 OK别一上来就 !dumpheap -stat——容易卡死或返回无意义数据。按问题类型选命令链:
!analyze -v → 看 FAULTING_IP 和 STACK_TEXT → 再用 !u 地址 反汇编托管方法(需 PDB 在符号路径中)~*e !clrstack 查所有线程托管栈 → 找重复出现的调用栈(比如都在 System.Threading.WaitHandle.WaitOne 或死循环里)!dumpheap -stat 看大头类型 → 记下类型名(如 MyApp.CacheItem)→ !dumpheap -type MyApp.CacheItem → 拿几个对象地址 → !gcroot 地址 查谁在引用它注意:!gcroot 输出里如果出现 Finalizer Queue 或 HandleTable,大概率是未释放的 IDisposable 或事件订阅泄漏。
这不是 WinDbg 问题,是 dump 缺少调试信息或对象已被 GC 回收但内存未覆写。常见于:
.s
ympath+ C:\path\to\pdbs + .reload /f
MiniDumpWithHeap 类型(不包含完整堆)→ 必须用 Full Dump(任务管理器右键 → “创建转储文件”,或 procdump -ma)string 或引用类型,但 !dumpobj 只显示引用地址 → 需再对地址执行一次 !dumpobj,或用 !do(简写)真正难的是跨 AppDomain 或跨上下文的对象引用链,这时候 !gcroot 可能只显示 DOMAIN(000001234567890),得结合源码确认生命周期管理逻辑。
邮箱:8955556@qq.com
Q Q:8955556
本文详解如何将Go官方present工具(用于生成HTML5...
PySNMP在不同版本中对SNMP错误状态(errorSta...
time.Sleep仅阻塞当前goroutine,其他gor...
PHPfopen()创建含特殊符号的文件名失败主因是操作系统...
WooCommerce中通过代码为分组产品动态聚合子商品的属...
io.ReadFull返回io.ErrUnexpectedE...
本文详解Yii2中控制器向视图传递ActiveRecord数...
本文详解为何通过wp_set_object_terms()为...
Pytest中使用@mock.patch类装饰器会导致补丁泄...
带缓冲的channel是并发安全的FIFO队列;make(c...