winDBG排错小记
去年底,公司一个上线了近一年的系统逐渐出现访问缓慢,操作超时的问题。本人使用winDBG工具对抓下来的内存映象进行了诊断,虽最后没有查出什么原因,但在过程中也学到了不少东西,现记录如下
一. “Failed to load data access DLL, 0x80004005”错误
这个错误还有另外一种提示:“The version of SOS does not match the version of CLR you are debugging”。
从原理上讲,象winDBG等非托管调试工具,是使用sos.dll模块,通过mscordacwks.dll接口,调用clr.dll实现,最终实现对.Net运行时托管代码的访问。这里有两点需要注意
1. sos.dll,mscordacwks.dll这两个之间的版本必须一致
2. sos.dll与被调用的映象运行时版本必须一致
上面两个有任意一处不一致,都会导致上述的错误信息。对于我,则是服务器是.net 4.0版本,我本机是4.6版本,即报此错误。解决的方案有两个
1. 使用正确版本的各个dll。一般来讲,从服务器除了复制内存映象文件外,还需复制以上两个dll,确保调试成功。至少需要复制sos.dll,winDBG在执行过程中会自动从符号文件服务器下载与当前sos.dll匹配版本的mscordacwks.dll。
2. 使用Psscor4工具。它是sos.dll的进阶版,添加了若干增强工具,会自动判断当前被调试的内存映象,下载正确匹配版本的mscordacwks.dll。推荐使用此方案。
What to do with “The version of SOS does not match the version of CLR you are debugging” in WinDbg?
“Failed to load data access DLL, 0x80004005” – OR – What is mscordacwks.dll?
二. 内存泄露是最常见的问题
公司使用的技术框架比较老,大部份仍停留在原生Sql + DataTable的方式上。我的第一反应是查询返回的数据太多,DataTable对象可能占用了过多的内存。下面的文章具体介绍了定位方法。
使用WinDbg+SOS及WinDbg Script寻找内存中DataTable第M行N列的值
抛出的异常过多,不正确的缓存使用也会造成内存的大量浪费
调试.NET Web应用程序High Memory - Part 1
调试.NET Web应用程序High Memory - Part 2
三. 线程死锁也是一个常见问题
使用Windbg找出死锁,解决生产环境中运行的软件不响应请求的问题
四. 最后,熟练掌握各条命令是活用winDBG的基础
《WinDbg 命令三部曲:(二)WinDbg SOS 扩展命令手册》
《WinDbg 命令三部曲:(三)WinDbg SOSEX 扩展命令手册》
winDBG排错小记的更多相关文章
- 第二章排错的工具:调试器Windbg(上)
感谢博主 http://book.51cto.com/art/200711/59731.htm <Windows用户态程序高效排错>第二章主要介绍用户态调试相关的知识和工具.本文主要讲了排 ...
- 第二章排错的工具:调试器Windbg(下)
感谢博主 http://book.51cto.com/art/200711/59874.htm 2.2 读懂机器的语言:汇编,CPU执行指令的最小单元2.2.1 需要用汇编来排错的常见情况 汇编是 ...
- 使用PowerShell替代WinDbg在高分辨率笔记本下调试、排错
最近换新的开发笔记本,分辨率较高发现部分应用在High DPI下几乎没法用.比较纠结的就是WinDbg,频繁切换分辨率.显示文字大小影响工作节奏.幸好PowerShell在High DPI下效果不错. ...
- Windbg程序调试--转载
WinDbg是微软发布的一款相当优秀的源码级(source-level)调试工具,可以用于Kernel模式调试和用户模式调试,还可以调试Dump文件. WinDbg是微软很重要的诊断调试工具: 可以查 ...
- windbg调试.net程序
1. 解决线上.NET应用程序的如下问题: 崩溃 CPU高 程序异常 程序Hang死 2. 安装WinDbg: http://msdn.microsoft.com/en-us/windows/hard ...
- 揪出“凶手”——实战WinDbg分析电脑蓝屏原因
http://www.appinn.com/blue-screen-search-code/ 蓝屏代码查询器 – 找出蓝屏的元凶 11 文章标签: windows / 系统 / 蓝屏. 蓝屏代码查询器 ...
- Windbg(2)
摘抄于:http://www.cnblogs.com/awpatp/category/228209.html Debug相关的一些小技巧 摘要: 1. 如何Debug一个进程的子进程? 答: 使用Wi ...
- 使用Windbg调试.Net应用程序 [转]
Windbg+Procdump解决w3wp.exe CPU过百问题[转] High CPU Dump收集工具 - ProcDump使用方法[转] ProcDump v9.0[官方] windbg查找c ...
- [原]排错实战——解救加载调试符号失败的IDA
原调试IDA排错troubleshootsymbolspdbsysinternalprocess monitor 缘起 最近想借助IDA逆向一个函数.在windows下,调试器(比如vs, windb ...
随机推荐
- android 按照拼音模糊查询中如何把字符转换成拼音
http://files.cnblogs.com/liaolandemengxiang/%E6%96%B0%E5%BB%BA%E6%96%87%E4%BB%B6%E5%A4%B9.rar 首先转换成的 ...
- android textview支持多种格式跳转
http://www.linuxidc.com/Linux/2011-08/40530p2.htm 1.android:autoLink属性,使TextView中链接手机号码/网页/邮件/地图 and ...
- OpenGL中的渐变颜色绘图(应力可视化)
#include <GL/glut.h> #include <iostream> #include <cmath> using namespace std; ; ; ...
- QT中的线程与事件循环理解(2)
1. Qt多线程与Qobject的关系 每一个 Qt 应用程序至少有一个事件循环,就是调用了QCoreApplication::exec()的那个事件循环.不过,QThread也可以开启事件循环.只不 ...
- java并发编程基础-ReentrantLock及LinkedBlockingQueue源码分析
ReentrantLock是一个较为常用的锁对象.在上次分析的uil开源项目中也多次被用到,下面谈谈其概念和基本使用. 概念 一个可重入的互斥锁定 Lock,它具有与使用 synchronized 相 ...
- [ X.XX]CF每日一题系列线下更新中
现在做的都好水啊,就不写博客了,线下有记录滴
- 必修3第三章概率mindmaps
% !Mode:: "TeX:UTF-8" \documentclass{article} \usepackage[screen]{geometry} \usepackage[no ...
- ASP.Net MVC OA项目笔记<二>
1.1.0 创建数据层 1.1.1 CZBK.ItcastOA.IDAL 引用 CZBK.ItcastOA.Model 1.2.1 给IDAL添加一个接口IUserInfoDal 里面写增删改查分页的 ...
- Java 泛型通配符
package com.waston; import java.util.*; public class Main { public static void main(String[] args) { ...
- Python之分支结构
if lengeh >= 100: #每个条件后面要使用冒号 if lengeh>=10000: ") elif lengeh>=1000: ') else: pass e ...