一步一个坑 - WinDbg调试.NET程序

第一次用WinDbg来排查问题,花了很多时间踩坑,记录一下希望对后面的同学有些帮助。

客户现场软件出现偶发性的界面卡死现象一直找不出原因,就想着让客户用任务管理器生成了一个dump文件发给我,我再用WinDbg看一下现线程堆栈。
找篇教程,按步骤一步一步来,应该挺简单吧。我想。

WinDbg软件版本选择

官方版本不“绿色”,最开始从第三方下了一个《WinDbg中文版(32位/64位) 6.12 独立版》v6.12.2.663
结果不管怎么尝试,加载CLR DLL的时候都提示

0:000> .cordll -u -ve -l
CLR DLL status: No load attempts

由于没经验,一直怀疑是不是自己哪里没有配置正确、操作有问题、敲键盘的姿势不对?。做了很多尝试,才意识到会不会下载的版本有问题,于是赶紧去官网下载(Debugging Tools for Windows (WinDbg, KD, CDB, NTSD))v6.3.9600.17298。果然!新的版本不会再出现这个提示! 有人说这是软件BUG。。。一口老血。。。

注:WinDbg历史版本

32位 vs 64位 该用哪个版本的WinDbg

下载的WinDbg有32和64位两个版本,该用哪个版本呢?我们可以参考这位园友的回答(一句话总结Windbg 32位版本和64位版本的选择)
他说:只有在实时用户态调试,并且调试器也在同一台64位机器上的情况下必须用64位的调试工具集。
那么我们调试dump,选择WinDbg x86应该没错了。

按套路来

因为一直失败,更换N种套路后,保留这一种:

  1. 设置符号地址
    菜单|File|Symbol File Path|设置符号地址 srv*c:\symbolspub*http://msdl.microsoft.com/download/symbols (如果你还有本地符号,点击Browse... 选择路径)
    一步一个坑 - WinDbg调试.NET程序_第1张图片

  2. 打开dump文件
    菜单|File|Open Crash Dump...|选择dump文件路径打开dump文件

  3. 加载SOS

    0:000> .cordll -ve -u -l
    CLRDLL: C:\Windows\Microsoft.NET\Framework\v2.0.50727\mscordacwks.dll:2.0.50727.8762 f:0
    doesn't match desired version 2.0.50727.5485 f:0
    CLRDLL: Unable to find mscordacwks_x86_x86_2.0.50727.5485.dll by mscorwks search
    CLRDLL: Unable to find 'mscordacwks_x86_x86_2.0.50727.5485.dll' on the path
    CLRDLL: Unable to get version info for 'c:\symbolspub\mscorwks.dll\53A121FA5ae000\mscordacwks_x86_x86_2.0.50727.5485.dll', Win32 error 0n87
    Cannot Automatically load SOS
    CLRDLL: ERROR: Unable to load DLL mscordacwks_x86_x86_2.0.50727.5485.dll, Win32 error 0n87
    CLR DLL status: ERROR: Unable to load DLL mscordacwks_x86_x86_2.0.50727.5485.dll, Win32 error 0n87

    诶,出错了,从日志可以看出缺少 c:\symbolspub\mscorwks.dll\53A121FA5ae000\mscordacwks_x86_x86_2.0.50727.5485.dll 文件。

这个文件从哪来?
1)客户计算机:NET2.0 x86 在 C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727 路径下的 mscordacwks.dll,其他版本类似;
2)从网络下载:这里有好心人已经打包了:Mscordacwks/SOS debugging archive;

把下载的文件重命名一下放到 c:\symbolspub\mscorwks.dll\53A121FA5ae000\mscordacwks_x86_x86_2.0.50727.5485.dll 路径下,这个路径就是前面设置的符号地址的存储路径。一定要确保版本完全一致,再加载一次就OK了。

加载成功后提示类似:

0:000> .cordll -u -ve -l
CLRDLL: C:\Windows\Microsoft.NET\Framework\v2.0.50727\mscordacwks.dll:2.0.50727.8762 f:0
doesn't match desired version 2.0.50727.5485 f:0
CLRDLL: Unable to find mscordacwks_x86_x86_2.0.50727.5485.dll by mscorwks search
CLRDLL: Unable to find 'mscordacwks_x86_x86_2.0.50727.5485.dll' on the path
CLRDLL: Unable to get version info for 'c:\symbolspub\mscorwks.dll\53A121FA5ae000\SOS_x86_x86_2.0.50727.5485.dll', Win32 error 0n87
Cannot Automatically load SOS
CLRDLL: Loaded DLL c:\symbolspub\mscorwks.dll\53A121FA5ae000\mscordacwks_x86_x86_2.0.50727.5485.dll
CLR DLL status: Loaded DLL c:\symbolspub\mscorwks.dll\53A121FA5ae000\mscordacwks_x86_x86_2.0.50727.5485.dll

如果一切正常,这时候输入 !threads 就可以看到托管线程了。

0:000:x86> !threads
ThreadCount: 22
UnstartedThread: 0
BackgroundThread: 20
PendingThread: 0
DeadThread: 1
Hosted Runtime: no
                                      PreEmptive   GC Alloc           Lock
       ID OSID ThreadOBJ    State     GC       Context       Domain   Count APT Exception
   0    1  7c0 000000000077d1d0      6020 Enabled  0000000000000000:0000000000000000 0000000000778c20     0 STA
   2    2  260 000000000078bfe0      b220 Enabled  0000000000000000:0000000000000000 0000000000778c20     0 MTA (Finalizer)
   5    4  fd0 00000000007ec5a8    80a220 Enabled  0000000000000000:0000000000000000 0000000000778c20     0 MTA (Threadpool Completion Port)
balabala...

【本文由“万能程序员”发布,2017年10月13日】

你可能感兴趣的:(一步一个坑 - WinDbg调试.NET程序)