windbg分析dump-解决mscorwks不匹配
前言
在使用.net的生产环境时,有时候我们会碰到程序闪退或内存溢出等异常现象,这时就需要将程序导出dump文件进行分析。有时候服务器的环境和本地环境可能不一致,就会导致分析dump文件时出现异常。
正常情况下我们通过.loadby sos mscorwks
加载默认路径下的mscorwks文件。加载成功后就可以同!threads
或!dumpheap
等命令进行具体的分析。若在输入!threads
等命令报如下的错误时,需要先解决环境不一致的问题。
0:000> .loadby sos mscorwks
0:000> !threads
PDB symbol for mscorwks.dll not loaded
Failed to load data access DLL, 0x80004005
Verify that 1) you have a recent build of the debugger (6.2.14 or newer)
2) the file mscordacwks.dll that matches your version of mscorwks.dll is
in the version directory
3) or, if you are debugging a dump file, verify that the file
mscordacwks_<arch>_<arch>_<version>.dll is on your symbol path.
4) you are debugging on the same architecture as the dump file.
For example, an IA64 dump file must be debugged on an IA64
machine.
You can also run the debugger command .cordll to control the debugger's
load of mscordacwks.dll. .cordll -ve -u -l will do a verbose reload.
If that succeeds, the SOS command should work on retry.
If you are debugging a minidump, you need to make sure that your executable
path is pointing to mscorwks.dll as well.
在解释该错误之前,我们首先了解一下sos.dll
、mscorwks.dll
和mscordacwks.dll
是什么。
什么是mscorwks
通用语言运行时 (CLR) 是执行托管代码的 Microsoft .NET 框架的核心引擎。mscorwks.dll
是CLR 2.0实现的主要文件。此引擎在本机代码中实现。
什么是SOS
SOS.DLL
可以提供关于CLR的信息,帮助我们在vs和windbg调试托管程序。例如,可以显示有关托管堆的信息、查找堆损坏情况、显示运行时使用的内部数据类型以及查看有关运行时内运行的所有托管代码的信息。
什么是mscordacwks
当我们想要使用本机调试器(如 CDB 或 WinDBG)调试 .NET 应用程序(如果我们想要使用事后内存转储文件来调试它,我们经常会执行很多这些操作),我们必须在本机调试器和托管世界之间使用一个"桥"进行连接,因为本机调试器本身并不了解托管代码。mscoradcwks是本机调试器,提供了连接本机和托管代码的“桥”。mscordacwks.dll
提供了允许 SOS 的数据访问组件 (DAC),以解释维护 .NET 应用程序状态的内存中数据结构。
综上所述,mscorwks使用本机代码实现了CLR,SOS可以提供托管的CLR信息,而mscordacwks即为连接本机代码和托管代码之间的桥。SOS无需了解CLR底层细节。
上述错误是什么意思?
上面的错误表示SOS.DLL
无法找到匹配的 mscordacwks.dll
。
什么时候会出现该错误
一般出现该错误提示有2个原因:
- 使用的应用程序和windbg的版本不一样,比如使用的是x64的程序但是却用x86版本的windbg加载进行分析。
- 另一个常见的原因是导出dump的计算机和分析dump文件的计算机的
.net framework
环境不一致。 - 当使用CLR不同版本时,若正确配置了符号文件服务器,则会尝试从符号文件服务器下载需要的
mscordacwks.dll
文件,若下载不到也会出现该错误。
如何修复错误
通过!sym noisy
命令打开消息提醒。
通过.symfix c:mylocalsymcache
尝试修复公共符号路径。
最后通过.cordll -ve -u -l
显示CLR文件加载的结果。
若报如下的错误,可能是使用的是绿色的windbg或缺少了相关的导致的。
0:000> .cordll -ve -u -l
CLR DLL status: No load attempts
正常时会输出sos相关文件的加载信息
2:2:092> .cordll -ve -u -l
CLRDLL: C:\Windows\Microsoft.NET\Framework64\v2.0.50727\mscordacwks.dll:2.0.50727.9151 f:0
doesn't match desired version 2.0.50727.8745 f:0
SYMSRV: BYINDEX: 0x1A
e:\开发工具\分析工具\symbols
mscordacwks_AMD64_AMD64_2.0.50727.8745.dll
573D296C9a0000
SYMSRV: UNC: e:\开发工具\分析工具\symbols\mscordacwks_AMD64_AMD64_2.0.50727.8745.dll\573D296C9a0000\mscordacwks_AMD64_AMD64_2.0.50727.8745.dll - path not found
SYMSRV: UNC: e:\开发工具\分析工具\symbols\mscordacwks_AMD64_AMD64_2.0.50727.8745.dll\573D296C9a0000\mscordacwks_AMD64_AMD64_2.0.50727.8745.dl_ - path not found
SYMSRV: UNC: e:\开发工具\分析工具\symbols\mscordacwks_AMD64_AMD64_2.0.50727.8745.dll\573D296C9a0000\file.ptr - path not found
SYMSRV: RESULT: 0x80070003
CLRDLL: Unable to find mscordacwks_AMD64_AMD64_2.0.50727.8745.dll by mscorwks search
CLRDLL: Unable to find 'mscordacwks_AMD64_AMD64_2.0.50727.8745.dll' on the path
SYMSRV: BYINDEX: 0x1B
e:\开发工具\分析工具\symbols
mscorwks.dll
573D296C9a0000
SYMSRV: UNC: e:\开发工具\分析工具\symbols\mscorwks.dll\573D296C9a0000\mscorwks.dll - path not found
SYMSRV: UNC: e:\开发工具\分析工具\symbols\mscorwks.dll\573D296C9a0000\mscorwks.dl_ - path not found
SYMSRV: UNC: e:\开发工具\分析工具\symbols\mscorwks.dll\573D296C9a0000\file.ptr - path not found
SYMSRV: RESULT: 0x80070003
DBGHELP: C:\WINDOWS\system32\mscorwks.dll - file not found
DBGHELP: C:\WINDOWS\system32\mscorwks.dll - file not found
DBGHELP: C:\WINDOWS\system32\mscorwks.dll - file not found
DBGHELP: mscorwks.dll not found in e:\开发工具\分析工具\symbols
DBGHELP: mscorwks.dll not found in e:\开发工具\分析工具\symbols
DBGHELP: mscorwks.dll not found in e:\开发工具\分析工具\symbols
CLRDLL: Unable to find mscorwks.dll by search
Cannot Automatically load SOS
CLRDLL: ERROR: Unable to load DLL mscordacwks_AMD64_AMD64_2.0.50727.8745.dll, Win32 error 0n2
CLRDLL: Consider using ".cordll -lp <path>" command to specify .NET runtime directory.
CLR DLL status: ERROR: Unable to load DLL mscordacwks_AMD64_AMD64_2.0.50727.8745.dll, Win32 error 0n2
可以发现,我本地的mscorwks的版本为2.0.50727.9151
,而dump文件需要的版本是2.0.50727.8745
。
此时我们可以将操作系统环境的mscorkws按照要求放到相应的目录下,比如把mscordacwks.dll
重命名为mscordacwks_AMD64_AMD64_2.0.50727.8745.dll
放到mscordacwks_AMD64_AMD64_2.0.50727.8745.dll\573D296C9a0000\
目录下。
这时候重新在输入.cordll -ve -u -l
就可以正常加载了。
0:000> .cordll -ve -u -l
CLRDLL: Loaded DLL e:\开发工具\分析工具\symbols\mscorwks.dll\573D296C9a0000\mscordacwks.dll
Automatically loaded SOS Extension
CLR DLL status: Loaded DLL e:\开发工具\分析工具\symbols\mscorwks.dll\573D296C9a0000\mscordacwks.dll
符号文件目录规则
可以看到我们的目录和文件名是mscordacwks_AAA_AAA_2.0.50727.xxxx.dll`格式,中间的AAA表示AI64或AMD64,后面的xxxx为dll的修订号。
573D296C9a0000
是通过PE文件头计算出的一个值。在vs的develpment 命令行下输入dumpbin /headers 文件路径
可以查看dll文件的pe文件头。
C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise>dumpBIN /headers E:\开发工具\分析工具\Symbols\mscorwks.dll\573D296C9a0000\mscorwks.dll
Microsoft (R) COFF/PE Dumper Version 14.27.29111.0
Copyright (C) Microsoft Corporation. All rights reserved.
Dump of file E:\开发工具\分析工具\Symbols\mscorwks.dll\573D296C9a0000\mscorwks.dll
PE signature found
File Type: DLL
FILE HEADER VALUES
8664 machine (x64)
6 number of sections
573D296C time date stamp Thu May 19 10:48:12 2016
...
OPTIONAL HEADER VALUES
...
0 Win32 version
9A0000 size of image
...
可以发现time date stamp
和size of image
拼起来恰好为573D296C9a0000
相关资料
“Failed to load data access DLL, 0x80004005” – OR – What is mscordacwks.dll?
mscordacwks.dll and mscorwks.dll confusions](https://stackoverflow.com/questions/670725/mscordacwks-dll-and-mscorwks-dll-confusions)
windbg分析dump-解决mscorwks不匹配的更多相关文章
- WinDbg分析Dump常用方法和命令
记录下自己使用WinDbg分析Dump时常用的一些方法和命令 !analyze -v //找出出错的堆 .exrc //找到程序崩溃的位置 !heap //打印出错函数的局部位置 !for_each_ ...
- Windows下利用Windbg 分析dump
概述: 注册生成dump文件的函数. 当程序收到没有捕获的异常时,调用上述函数,生成dump文件. 利用Windbg结合编译程序时生成的pdb和代码来分析dump文件,定位问题. 如下代码生成dump ...
- WinDbg分析DUMP文件
1. 如何生成dump文件? 原理:通过SetUnhandledExceptionFilter设置捕获dump的入口,然后通过MiniDumpWriteDump生成dump文件: ...
- 使用 WinDbg 分析dump文件
步骤一: 生成dump文件. #include <Windows.h> #include <iostream> #include <DbgHelp.h> #incl ...
- WinDbg 分析dump
1.生成dump文件. 在代码捕获异常,并将异常写入dump文件. #include "stdafx.h" #include <Windows.h> #include ...
- WinDbg分析dump文件排查bug
文章:WinDbg-如何抓取dump文件 命令: cd C:\Windows\System32\inetsrv appcmd list wp 可以查看各个站点的pid
- 关于ODP.NET连接数监控及相应的windbg分析提示
1.关于ODP.NET的Windows计数器问题 使用微软的缺省驱动时,可以通过windows性能监视器很方便的监控数据库连接数,选择.NET Data Provider for Oracle/Sql ...
- Windbg分析蓝屏Dump文件
一.WinDbg是什么?它能做什么? WinDbg是在windows平台下,强大的用户态和内核态调试工具.它能够通过dmp文件轻松的定位到问题根源,可用于分析蓝屏.程序崩溃(IE崩溃)原因,是我们日常 ...
- 使用WinDbg分析蓝屏dump原因
大多数人或许都经历过系统蓝屏问题,然而大多数人不清楚该怎么处理蓝屏问题,这里主要对系统蓝屏做一些解释,同时介绍下蓝屏问题分析工具WinDbg分析蓝屏问题的一般步骤. 微软官方对蓝屏的定义是,当系统遇到 ...
随机推荐
- 【HttpRunner v3.x】笔记—7. 测试用例-teststeps-RunTestCase
以前我在写接口自动化用例的时候,为了保证用例的独立性,需要在setUp里调用各种满足用例的一些前置条件,其中就不乏调用了其他测试用例中的方法. 而httprunner也是支持了这一项很重要的特性,通过 ...
- MySQL 增删查改 必知必会
MySQL 数据库中的基础操作 3.表的修改 对表的表名.字段.字段类型.字段长度.约束等进行修改. 3.1 表的名称修改 -- 语法: ALTER TABLE 库名.表名 RENAME TO 新表名 ...
- POJ-1001-Exponentiation(高精度大数)
Problems involving the computation of exact values of very large magnitude and precision are common. ...
- AngularJS中的父作用域与自作用域
对于$scope上的原生类型,如$scope.name=""; 自作用域获取变量时,会查找作用域本身,找不到就会查找父作用域 修改时,若本作用域不存在,就会在本作用域创建一个变量, ...
- codewars贪吃蛇算法题目
有这样一个题目: Given an n x n array, return the array elements arranged from outermost elements to the mid ...
- 超详细,Windows系统搭建Flink官方练习环境
如何快速的投入到Flink的学习当中,很多人在搭建环境过程中浪费了太多的时间.一套一劳永逸的本机Flink开发环境可以让我们快速的投入到Flink的学习中去,将精力用在Flink的原理,实战.这也对于 ...
- intellij idea 无法进行调试的解决方案
inteliij idea 如果出现无法调试该怎样做?debug中各功能为灰色. 如果你用的是外来项目,可能是没有添加这个项目自带的library: 解决办法: 在file->project ...
- leetcode刷题-51N皇后
题目 n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击. 给定一个整数 n,返回所有不同的 n 皇后问题的解决方案. 每一种解法包含一个明确的 n 皇后问 ...
- Require.js中的路径在IDEA中的最佳实践
本文主要讲述require.js在IDEA中路径智能感知的办法和探索中遇到的问题. 测试使用的目录结构:一种典型的thinkphp 6的目录结构,如下图. 现在我通过在 vue-a.js 中运用不同的 ...
- JS语法_集合
数组方法 forEach // no-log Array.prototype.forEach_ = function (cb) { let len = this.length for (let i = ...