首页 > 技术文章 > windbg sos版本不匹配问题解决

thaughtZhao 2014-12-26 19:48 原文

dumpheap 时提示:

0:105> !dumpheap -stat
The garbage collector data structures are not in a valid state for traversal.
It is either in the "plan phase," where objects are being moved around, or
we are at the initialization or shutdown of the gc heap. Commands related to
displaying, finding or traversing objects as well as gc heap segments may not
work properly. !dumpheap and !verifyheap may incorrectly complain of heap
consistency errors.
Error requesting GC Heap data
Unable to build snapshot of the garbage collector state

 

这种情况大部分是由于sos版本不匹配导致:

0:105> .cordll –ve –u –l

CLRDLL: Loaded DLL C:\Windows\Microsoft.NET\Framework64\v4.0.30319\mscordacwks.dll
CLR DLL status: Loaded DLL C:\Windows\Microsoft.NET\Framework64\v4.0.30319\mscordacwks.dll

.cordll –ve –u –l (小写的L ) 这个命令是控制调试和控制CLR的命令,-ve是显示详细信息,-u 卸载模块,-l (小写的L) 是加载模块,上面这个命令就是卸载CLR 调试模块,然后再加载CLR调试模块,并显示详细信息

貌似已经加载正确,此时,重新运行dumpheap,错误仍然存在。

 

当前系统mscordacwks.dll版本和dump来源系统版本不同,将来源系统对应版本的mscordacwks.dll复制到对应的搜索目录(Symbol File Path、Source File Path和Image File Path都可以),并重新加载。这个时候你会发现在Symbol File Path已经下载了对应的mscordacwks.dll运行时版本,比如:mscordacwks_AMD64_AMD64_4.0.30319.01.dll\4BA21EEB965000\mscordacwks_AMD64_AMD64_4.0.30319.01.dll。

调试机器和来源机器SOS.dll、clr.dll版本不一致,将来源机器的两个文件复制到一个指定目录。用.load命令加载这个版本的sos,再次执行~* e !clrstack,运行成功。之后执行sos的任何命令WinDbg都会提示如下信息(暂时忽略它):

http://www.cnblogs.com/junchu25/archive/2012/09/04/2670540.html

 

 

0:105> .chain
Extension DLL search Path:
    D:\windbg\WINXP;D:\windbg\winext;D:\windbg\winext\arcade;D:\windbg\pri;D:\windbg;D:\windbg\winext\arcade;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Program Files\7-Zip;D:\Program Files (x86)\Microsoft SQL Server\100\Tools\Binn\;D:\Program Files\Microsoft SQL Server\100\Tools\Binn\;D:\Program Files\Microsoft SQL Server\100\DTS\Binn\;D:\Program Files (x86)\Microsoft SQL Server\100\Tools\Binn\VSShell\Common7\IDE\;D:\Program Files (x86)\Microsoft SQL Server\100\DTS\Binn\;C:\Windows\System32\WindowsPowerShell\v1.0\;D:\Program Files\Java\jdk1.6.0_25\bin;D:\Program Files\Java\jdk1.6.0_25\JRE\bin
Extension DLL chain:
    sosex: image 4.5.0.0, API 1.0.0, built Wed Oct 03 22:57:55 2012
        [path: D:\windbg\sosex.dll]
 
   sos: image 4.0.30319.18408, API 1.0.0, built Thu Sep 06 14:07:11 2012
        [path: D:\windbg\sos.dll]

    C:\Windows\Microsoft.NET\Framework64\v4.0.30319\sos: image 4.0.30319.18408, API 1.0.0, built Thu Sep 12 08:02:43 2013
        [path: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\sos.dll]
    dbghelp: image 6.13.0001.776, API 6.1.6, built Sat May 15 04:57:22 2010
        [path: D:\windbg\dbghelp.dll]
    ext: image 6.13.0001.776, API 1.0.0, built Sat May 15 04:57:40 2010
        [path: D:\windbg\winext\ext.dll]
    exts: image 6.13.0001.776, API 1.0.0, built Sat May 15 04:57:13 2010
        [path: D:\windbg\WINXP\exts.dll]
    uext: image 6.13.0001.776, API 1.0.0, built Sat May 15 04:57:09 2010
        [path: D:\windbg\winext\uext.dll]
    ntsdexts: image 6.1.7752.0, API 1.0.0, built Sat May 15 04:52:37 2010
        [path: D:\windbg\WINXP\ntsdexts.dll]

 

貌似加载了两个sos.dll

0:105> .unload sos
Unloading sos extension DLL
0:105> .chain
Extension DLL search Path:
    D:\windbg\WINXP;D:\windbg\winext;D:\windbg\winext\arcade;D:\windbg\pri;D:\windbg;D:\windbg\winext\arcade;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Program Files\7-Zip;D:\Program Files (x86)\Microsoft SQL Server\100\Tools\Binn\;D:\Program Files\Microsoft SQL Server\100\Tools\Binn\;D:\Program Files\Microsoft SQL Server\100\DTS\Binn\;D:\Program Files (x86)\Microsoft SQL Server\100\Tools\Binn\VSShell\Common7\IDE\;D:\Program Files (x86)\Microsoft SQL Server\100\DTS\Binn\;C:\Windows\System32\WindowsPowerShell\v1.0\;D:\Program Files\Java\jdk1.6.0_25\bin;D:\Program Files\Java\jdk1.6.0_25\JRE\bin
Extension DLL chain:
    C:\Windows\Microsoft.NET\Framework64\v4.0.30319\sos: image 4.0.30319.18408, API 1.0.0, built Thu Sep 12 08:02:43 2013
        [path: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\sos.dll]
    dbghelp: image 6.13.0001.776, API 6.1.6, built Sat May 15 04:57:22 2010
        [path: D:\windbg\dbghelp.dll]
    ext: image 6.13.0001.776, API 1.0.0, built Sat May 15 04:57:40 2010
        [path: D:\windbg\winext\ext.dll]
    exts: image 6.13.0001.776, API 1.0.0, built Sat May 15 04:57:13 2010
        [path: D:\windbg\WINXP\exts.dll]
    uext: image 6.13.0001.776, API 1.0.0, built Sat May 15 04:57:09 2010
        [path: D:\windbg\winext\uext.dll]
    ntsdexts: image 6.1.7752.0, API 1.0.0, built Sat May 15 04:52:37 2010
        [path: D:\windbg\WINXP\ntsdexts.dll]


此时,只有一个sos了,在运行dumpheap试试:

0:105> !dumpheap -stat
Statistics:
              MT    Count    TotalSize Class Name
000007fef29fd978        1           24 System.Xml.Linq.XHashtable`1[[System.WeakReference, mscorlib]]
000007fef29fd880        1           24 System.Xml.Linq.XHashtable`1[[System.Xml.Linq.XName, System.Xml.Linq]]

 

推荐隔椅同事的文章,列举了各种可能:

http://www.cnblogs.com/softfair/p/The_version_SOS_not_match_version_of_CLR_PDB_symbol_for_clr_dll_not_loaded.html

 

SRV*c:\mysymbol* http://msdl.microsoft.com/download/symbols

推荐阅读