如何将dotnetframework3.5的dmp文件在windbg中有效分析?
摘要:一个dotnetframe3.5的windows服务出现死锁,dmp下来后无法自动加载sos.dll,经过以下几个过程,问题解决。过程大致如下。 windbg第一次打开得到的dmp文件,有类似提示 ADDITIONAL_DEBUG_TEXT
一个dotnetframe3.5的windows服务出现死锁,dmp下来后无法自动加载sos.dll,经过以下几个过程,问题解决。过程大致如下。
windbg第一次打开得到的dmp文件,有类似提示
ADDITIONAL_DEBUG_TEXT: SOS.DLL is not loaded for managed code. Analysis might be incomplete
执行
.cordll -ve -u -l
提示
0:000> .cordll -ve -u -l
CLR DLL status: No load attempts
原因是32位的程序跑在64位操作系统时,没有使用32位的任务管理器来“创建内存转储文件”。
在命令行录入以下命令打开32位任务管理器
C:\Windows\SysWOW64\Taskmgr.exe
有了32位的dmp后,用最新的windbg打开,依然没有自动加载sos。那就看看需要哪个sos.dll了
首先开日志,看看要什么文件。执行以下命令序列:
!sym noisy
.cordll -ve -u -l
你会看到类似信息
0:000> .cordll -ve -u -l
CLRDLL: C:\Windows\Microsoft.NET\Framework\v2.0.50727\mscordacwks.dll:2.0.50727.9179 f:0
doesn't match desired version 2.0.50727.8980 f:0
SYMSRV2: [mscordacwks_x86_x86_2.0.50727.8980.dll] Uri C:\ProgramData\Dbg\sym\mscordacwks_x86_x86_2.0.50727.8980.dll\669159A3621000\file.ptr
SYMSRV2: [mscordacwks_x86_x86_2.0.50727.8980.dll] Uri C:\ProgramData\Dbg\sym\mscordacwks_x86_x86_2.0.50727.8980.dll\669159A3621000\file.ptr
SYMSRV2: [index2.txt] GET from host msdl.microsoft.com
SYMSRV2: [index2.txt] Downloaded 0 percentSYMSRV2: Header reply: http/1.1 404 not found
拿上面的信息去问元宝,提示以下内容
方法一:获取匹配的 DLL(推荐)
这是最直接可靠的方法。
获取正确的 DLL:从产生此 dump 文件的原始计算机上,复制 C:\Windows\Microsoft.NET\Framework\v2.0.50727\mscordacwks.dll文件。
重命名文件:将复制过来的 mscordacwks.dll重命名为错误信息中明确要求的文件名:mscordacwks_x86_x86_2.0.50727.8980.dll。
放置文件:将重命名后的文件放入您的符号路径(例如 `c:\symbols`下的相应目录)或 WinDbg 的安装目录
如果完全按元宝提示去做,你可能会在拷贝文件到c:\symbols时提示文件已存在,无法拷贝。这是因为c:\symbols可能有一个跟dll一样名字的目录。删除这个目录,拷贝文件进去,还是不行。
