WinDbg调试托管程序环境问题总结
基本环境搭建及安装
安装
有2个方式可以安装WinDbg。
- 新版 安装WinDbg Preview
在商店里搜WinDbg直接就可以安装,这里安装的版本是x64版本。x64版本的WinDbg其实是可以调试x86版本的程序,直接附加到进程就可以了,这也是我们推荐的方式。 - 旧版 安装windows sdk
- 由于官方不提供独立的旧的WinDbg安装方式,需要安装Windows sdk。
参考链接:
Download the Windows Driver Kit (WDK) - Windows drivers | Microsoft Docs - 或者可以直接下载6.0打包好的版本云盘:pan.baidu.com/s/1VqXVIGVH… 提取码:mahg
- 由于官方不提供独立的旧的WinDbg安装方式,需要安装Windows sdk。
这里建议新旧两个版本都安装,实际调试时候都可能需要用到。
配置与调试
配置: 增加系统环境变量:
_NT_SYMBOL_PATH
对应的值为:
SRV*C:\Symbols*http://msdl.microsoft.com/download/symbols
加载SOS.dll
SOS是在ntsd或windbag下调试.Net程序的扩展。有两种方式可以加载。
.loadby
一般使用.loadby sos clr
(针对.net framework 4.x)没有报错就代表正确加载了。实际上根据情况有如下几种选择:
.loadby sos mscorsvr
.loadby sos mscorwks
.loadby sos clr
.loadby sos coreclr
.loadby sos <somethingelse>
如何选择参考链接: .net - Cannot .loadby sos mscorwks or .loadby sos clr - Stack Overflow
.loadby
对第一种方式的不能正确加载的情况,可以自行加载,使用方式如下:.load C:\Windows\Microsoft.NET\Framework64\v4.0.30319\sos.dll
接下来就能愉快的使用!eeheap等命令调试了。
注意:不要在.net clr还没有加载的时候就尝试加载sos 键入
g
直到clr加载后再中断重新加载sos.dll。
特殊情况的处理
如果只调试自己电脑上的程序那么一般情况比较简单,但调试客户的程序会遇到各种各样的情况。例如如下两种最常见的场景。
1. 32位兼容程序的调试
有时我们在生成项目时,选择了优先32位。生成32的程序在我们现在的64位环境下,会运行在wow64下。
这个时候我们是可以直接使用x64版本的windbg直接附加到进程调试的,但是对客户的机器上的程序,我们很多时候都需要生成dump来分析当时的问题。直接用默认的64位任务管理器生成的dump并不能直接分析,给bug的分析带来很多困难。我们可能会看到如下提示信息。
0:000> !eeheap
SOS does not support the current target architecture.
或者,
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.
按照提示输入.cordll -ve -u -l
后有如下提示。
.cordll -ve -u -l
CLR DLL status: No load attempts
使用windbg preview时可以在堆栈中看到wow64等字样就是遇到了这种问题。
我们可以通过如下方式解决:
- 使用32位的任务管理器重新抓dump。
32位任务管理器位于C:\Windows\SysWOW64\Taskmgr.exe
下。参考链接:.Net Dump 的分析 I | 非洲海星的深海大鳳梨 (wordpress.com)
- 使用32位的任务管理器重新抓dump。
- 使用
soswow64
加载sos
这里一定要使用旧版的windbg x86版本并下载soswow64放到指定目录下。
使用.load soswow64
加载后就能使用sos中的扩展命令。github中的readme说的非常清楚。
- 使用
2. clr运行环境不符的调试
有时调试的目标dump的clr版本与本地并不相符,使用 .cordll -ve -u -l
命令有如下类似提示。
unable to find mscordacwks_x86_x86_4.7.3110.00.dll by mscorwks search
可以按提示拷贝目标机器上的相应dll,重命名后放到windbg的目录下。
参考:
Windbg调试SOS.DLL和CLR 不匹配问题_SpringDou的博客-CSDN博客
Q&A
能在vs下使用sos扩展么?
现在版本的vs已经不支持加载sos了,但是可以使用稍旧版本vs并配合如下扩展。(未测试过)
angelhernandezm/visualsos: Visual SOS is both a standalone application (x64) and extension for Visual Studio that exposes functionality in SOS (debugging extension) not available in Visual Studio Debugger. (github.com)可以使用哪些sos命令?
参考官方文档:SOS.dll (SOS Debugging Extension) - .NET Framework | Microsoft Docs
其他参考链接
- dotnet core下的配置。教你配置windows上的windbg,linux上的lldb,打入clr内部这一篇就够了 - 掘金 (juejin.cn)
- windbg - Failed to load data access DLL, 0x80004005 - Stack Overflow
- "Failed to load data access DLL, 0x80004005" when debugging a live process on local machine (microsoft.com)
- How to use Windbg to debug a dump of a 32bit .NET app running on a x64 machine - PKI Extensions (sysadmins.lv)
- visual studio 2010 - Debugging dump of 32-bit process captured on 64-bit machine - Stack Overflow
- 调试运行在Wow64子系统下的程序----x64版windbg调试win32程序_lixiangminghate的专栏-CSDN博客
WinDbg调试托管程序环境问题总结的更多相关文章
- WinDBG调试.NET程序示例
WinDBG调试.NET程序示例 好不容易把环境打好了,一定要试试牛刀.我创建了一个极其简单的程序(如下).让我们期待会有好的结果吧,阿门! using System; using System.Co ...
- WinDbg调试.NET程序入门
俗话说:万事开头难! 自从来到新公司遇到性能问题后,需要想办法解决这个问题,但是一直没有合适的性能分析工具,然后找到StevenChennet 大神帮忙,他用WinDbg工具远程帮我分析了一个 dum ...
- WinDbg 调试.net程序
WinDbg支持以下三种类型的命令: · 常规命令,用来调试进程 · 点命令,用来控制调试器 · 扩展命令,可以添加叫WinDbg的自定义命令,一般由扩展dl ...
- windbg调试.net程序
1. 解决线上.NET应用程序的如下问题: 崩溃 CPU高 程序异常 程序Hang死 2. 安装WinDbg: http://msdn.microsoft.com/en-us/windows/hard ...
- 一步一个坑 - WinDbg调试.NET程序
引言 第一次用WinDbg来排查问题,花了很多时间踩坑,记录一下希望对后面的同学有些帮助. 客户现场软件出现偶发性的界面卡死现象一直找不出原因,就想着让客户用任务管理器生成了一个dump文件发给我,我 ...
- Windows调试学习笔记:(二)WinDBG调试.NET程序示例
好不容易把环境打好了,一定要试试牛刀.我创建了一个极其简单的程序(如下).让我们期待会有好的结果吧,阿门! using System; using System.Collections.Generic ...
- WinDbg调试.NET
WinDbg调试.NET程序入门 俗话说:万事开头难! 自从来到新公司遇到性能问题后,需要想办法解决这个问题,但是一直没有合适的性能分析工具,然后找到StevenChennet 大神帮忙,他用WinD ...
- windbg调试托管代码 .Net clr
现在很多的程序都是多语言混合编程的,比如我司的产品,就是用C++/.net clr混合编制的.那么当我们调试这样的程序时,一定要注意,比如有时我们只看到c++的栈和名称,而.net clr的代码确看不 ...
- 转:windbg调试堆
转:http://www.cnblogs.com/dsky/archive/2013/05/15/3079363.html 简评: 代码中采用malloc/free进行堆申请,实际调用的仍然是Heap ...
随机推荐
- CSS网页使用Font Awesome图标字体时,css定义 content 属性
原文地址: http://blog.csdn.net/laurel_y/article/details/70842157
- 稳住,传输层里的TCP与UDP协议
传输层协议 1.TCP协议介绍及报文格式 2.TCP三次握手三次挥手 3.UDP协议介绍 1.传输层有两个协议:TCP(传输控制协议) UDP(用户数据协议) . TCP是面向连接的,可靠的进程到进 ...
- pandas中常用的操作一
pandas中常用的功能: 1.显示所有的列的信息,999表示显示最大的列为999 pd.options.display.max_columns=999 2.读取excel时设置使用到列的名称,和列的 ...
- MindSpore多元自动微分
技术背景 当前主流的深度学习框架,除了能够便捷高效的搭建机器学习的模型之外,其自动并行和自动微分等功能还为其他领域的科学计算带来了模式的变革.本文我们将探索如何用MindSpore去实现一个多维的自动 ...
- Solution Set - 《赏竹而格之》
1.「GXOI / GZOI 2019」「洛谷 P5304」旅行者 Link & Submission. 经典二进制分组,没啥好说的. 2. 「SDOI 2019」「洛谷 P5361」 ...
- Java并发杂谈(一):volatile的底层原理,从字节码到CPU
volatile的特性 volatile是Java中用于修饰变量的关键字,其主要是保证了该变量的可见性以及顺序性,但是没有保证原子性:其是Java中最为轻量级的同步关键字: 接下来我将会一步步来分析v ...
- 思迈特软件Smartbi光鲜亮丽的背后是什么在支撑?
思迈特软件Smartbi是国内知名BI厂商,自2011年成立以来就以提升和挖掘客户的价值为使命,致力于为客户提供一站式商业智能平台和BI解决方案,发展到如今已经获得了来自国家.地方政府.国内外权威分析 ...
- MSBuild 和项目文件
Microsoft 生成引擎(MSBuild)项目文件位于生成和部署过程的核心. 本主题以 MSBuild 和项目文件的概念性概述开头. 它介绍了在处理项目文件时将遇到的关键组件,并通过一个示例来演示 ...
- (二)ECMA 335 解析 /ECMA 334
C#被ECMA组织,定义为了<ECMA334>标准化语言. 什么概念? 比如说,上一次成为ECMA标准的语言是Javascript.即<ECMA262>标准. <ECMA ...
- JavaWeb-网络编程
Java网络编程 推荐阅读: 计算机网络:https://www.cnblogs.com/zwtblog/tag/计算机网络/ 计算机网络基础 利用通信线路和通信设备,将地理位置不同的.功能独立的多台 ...