WinDbg调试.NET程序入门
俗话说:万事开头难!
自从来到新公司遇到性能问题后,需要想办法解决这个问题,但是一直没有合适的性能分析工具,然后找到StevenChennet 大神帮忙,他用WinDbg工具远程帮我分析了一个 dump文件,但是只看到键盘 “啪啪啪”,得到了结果,却不是很清楚WinDbg神奇具体如何使用的。结果,第二天,性能问题又来了,总不能每次劳烦大神驾到,所以不得不自己开始学习WinDbg,这里记录一个入门过程。
1,首先,下载并安装WinDbg程序
从下面的地址打开:
https://msdn.microsoft.com/en-us/windows/hardware/hh852365
然后看到
Standalone Debugging Tools for Windows (WinDbg)
下载。
安装好后,在开始-》Windows Kits文件夹下有 WinDbg(x86),WinDbg(x64) 两个程序的快捷方式,如果你要调试
64位的程序,就用WinDbg(x64)。
2,创建内存转储文件
可以在任务管理器,进程-》创建转储文件 里面,得到当前进程的dump文件,我是用下面这个程序来生成转储文件的:
Procdump
下载地址:https://technet.microsoft.com/en-us/sysinternals/dd996900.aspx
有关 ProDump程序的使用,可以参考下面2个博客文章:
High CPU Dump收集工具 - ProcDump使用方法
在命令行,运行这个程序:
procdump -ma mydotNetApp.exe d:\myapp.dmp
运行后,将得到一个myapp.dmp 文件,如果这个文件是在本机生成的,那么VS2013可以直接打开这个文件并可以分析托管内存,但是,往往内存转储文件是 在服务器生成的,而服务器又很可能跟开发环境不一样,所以才需要本文介绍的 WinDbg来调试。
3,配置调试环境
首先,打开我们刚才的转储文件,可以使用菜单命令打开:
File->Open Crash Dump...
打开后,会显示程序当时运行所在的环境,此时,会提示符号文件没有发现:
*** ERROR: Symbol file could not be found. Defaulted to export symbols for ntdll.dll -
如果不配置,使用命令的时候会提示错误,比如:
:> .loadby sos clrjit
:> !tp
*** ERROR: Symbol file could not be found. Defaulted to export symbols for clr.dll - ************* Symbol Loading Error Summary **************
Module name Error
clr PDB not found : e:\appserver\symbols\dll\clr.pdb
e:\appserver 是我的dmp文件所在的目录,它默认是到symbols 子目录去找符号文件去了。
然后,配置下使用此文件的调试环境。
在菜单命令 File->Symbol path... 打开对话框,选择浏览,找到dmp文件所在目录相关的程序文件目录 E:\AppServer ,该目录下面有程序相关的 exe,pdb 文件。
输入下面的命令:
:> .sympath+ c:\symbols
Symbol search path is: E:\AppServer;c:\symbols
Expanded Symbol search path is: e:\appserver;c:\symbols
Error: Attempts to access 'c:\symbols' failed: 0x2 - 系统找不到指定的文件。 ************* Symbol Path validation summary **************
Response Time (ms) Location
OK E:\AppServer
Error
这里不用管,这个文件夹后面可以生成。
:> .symfix
:> .symfix+ c:\symbols
:> .sympath
Symbol search path is: srv*
Expanded Symbol search path is: SRV*c:\symbols*http://msdl.microsoft.com/download/symbols ************* Symbol Path validation summary **************
Response Time (ms) Location
Deferred
这下对了。
执行下 reload命令:
:> .reload
................................................................
................................................................
............
接着执行下面:
:> .loadby sos clr
:> !tp
The version of SOS does not match the version of CLR you are debugging. Please
load the matching version of SOS for the version of CLR you are debugging.
CLR Version: 4.0.30319.296
SOS Version: 4.6.96.0
Failed to load data access DLL, 0x80004005
这里提示说SOS的版本更CLR不匹配,这里需要找到当时生成Dump文件所在的服务器上的 sos.dll,注意,因为服务器程序是64位的,所以必须在 .Net Framework64 目录去找,同时把 mscordacwks.dll 文件一起拷贝过来(先暂时不用,下面马上会讲到)。
刚才这个命令执行后,我们惊喜的发现,c:\symbols 目录自己创建了,并且下载了 clr.pdb等几个目录,这是再将刚才服务器上拷贝的 sos.dll, mscordacwks.dll ,放到本地机器的 c:\symbols 目录下面。
再次执行这几个命令:
:> .reload
................................................................
................................................................
............
:> .loadby sos clr
:> !tp
The version of SOS does not match the version of CLR you are debugging. Please
load the matching version of SOS for the version of CLR you are debugging.
CLR Version: 4.0.30319.296
SOS Version: 4.6.96.0
Failed to load data access DLL, 0x80004005
还是报错,看来 sos.dll 没有加载正确,用下面的命令:
:> .load c:\symbols\sos.dll
:> .loadby sos clr
:> !tp
这里load命令必须带SOS.dll的路径。加载了它,然后执行 .loadby sos clr ,表示调试.NET托管程序。
开始漫长的等待,程序窗口提示:
*BUSY*
Downloading symbols for [clr.pdb] /
等到相关的符号文件全部下载完毕,终于出现了久违的成功界面:
CPU utilization: %
Worker Thread: Total: Running: Idle: MaxLimit: MinLimit:
Work Request in Queue:
--------------------------------------
Number of Timers:
--------------------------------------
Completion Port Thread:Total: Free: MaxFree: CurrentLimit: MaxLimit: MinLimit:
4,获取帮助信息
有关WinDbg详细的调试命名,可以参考下面文章:
windbg调试命令
http://www.cnblogs.com/kekec/archive/2012/12/02/2798020.html
或者,你也可以随时用帮助,查看如何使用:
:> !help
-------------------------------------------------------------------------------
SOS is a debugger extension DLL designed to aid in the debugging of managed
programs. Functions are listed by category, then roughly in order of
importance. Shortcut names for popular functions are listed in parenthesis.
Type "!help <functionname>" for detailed info on that function. Object Inspection Examining code and stacks
----------------------------- -----------------------------
DumpObj (do) Threads
DumpArray (da) ThreadState
DumpStackObjects (dso) IP2MD
DumpHeap U
DumpVC DumpStack
GCRoot EEStack
ObjSize CLRStack
FinalizeQueue GCInfo
PrintException (pe) EHInfo
TraverseHeap BPMD
COMState Examining CLR data structures Diagnostic Utilities
----------------------------- -----------------------------
DumpDomain VerifyHeap
EEHeap VerifyObj
Name2EE FindRoots
SyncBlk HeapStat
DumpMT GCWhere
DumpClass ListNearObj (lno)
DumpMD GCHandles
Token2EE GCHandleLeaks
EEVersion FinalizeQueue (fq)
DumpModule FindAppDomain
ThreadPool SaveModule
DumpAssembly ProcInfo
DumpSigElem StopOnException (soe)
DumpRuntimeTypes DumpLog
DumpSig VMMap
RCWCleanupList VMStat
DumpIL MinidumpMode
AnalyzeOOM (ao) Examining the GC history Other
----------------------------- -----------------------------
HistInit FAQ
HistRoot
HistObj
HistObjFind
HistClear
也可以使用 .help命令,这个不一样,这里列出部分命令:
:> .help
. commands:
.allow_exec_cmds [|] - control execution commands
.allow_image_mapping [|] - control on-demand image file mapping
.apply_dbp [<options>] - add current data breakpoint state to a
register context
.asm [<options>] - set disassembly options
.asm- [<options>] - clear disassembly options
.attach <proc> - attach to <proc> at next execution
.block { <commands> } - brackets a set of commands for nested execution
.break - break out of the enclosing loop
也可使用.hh命令:
Use ".hh <command>" or open debugger.chm in the debuggers directory to get
detailed documentation on a command.
OK,有了dump文件生成,调试环境配置,还有帮助命令,现在总算是入门了。
WinDbg调试.NET程序入门的更多相关文章
- WinDBG调试.NET程序示例
WinDBG调试.NET程序示例 好不容易把环境打好了,一定要试试牛刀.我创建了一个极其简单的程序(如下).让我们期待会有好的结果吧,阿门! using System; using System.Co ...
- WinDbg调试托管程序环境问题总结
基本环境搭建及安装 安装 有2个方式可以安装WinDbg. 新版 安装WinDbg Preview 在商店里搜WinDbg直接就可以安装,这里安装的版本是x64版本.x64版本的WinDbg其实是可以 ...
- 使用WinDbg调试SQL Server——入门
这篇文章我想探究下SQL Server里完全不同的领域:如果使用WinDbg(来自针对Windows的调试工具)调试SQL Server.在我们进入枯涩细节之前,我想详细解释下为什么选择这样晦涩的话题 ...
- WinDbg 调试.net程序
WinDbg支持以下三种类型的命令: · 常规命令,用来调试进程 · 点命令,用来控制调试器 · 扩展命令,可以添加叫WinDbg的自定义命令,一般由扩展dl ...
- Windows调试学习笔记:(二)WinDBG调试.NET程序示例
好不容易把环境打好了,一定要试试牛刀.我创建了一个极其简单的程序(如下).让我们期待会有好的结果吧,阿门! using System; using System.Collections.Generic ...
- windbg调试.net程序
1. 解决线上.NET应用程序的如下问题: 崩溃 CPU高 程序异常 程序Hang死 2. 安装WinDbg: http://msdn.microsoft.com/en-us/windows/hard ...
- 一步一个坑 - WinDbg调试.NET程序
引言 第一次用WinDbg来排查问题,花了很多时间踩坑,记录一下希望对后面的同学有些帮助. 客户现场软件出现偶发性的界面卡死现象一直找不出原因,就想着让客户用任务管理器生成了一个dump文件发给我,我 ...
- 使用WinDbg调试SQL Server——入门:Woodytu
http://www.cnblogs.com/woodytu/p/4663525.html https://www.sqlpassion.at/archive/2014/05/13/debugging ...
- WinDbg调试.NET
WinDbg调试.NET程序入门 俗话说:万事开头难! 自从来到新公司遇到性能问题后,需要想办法解决这个问题,但是一直没有合适的性能分析工具,然后找到StevenChennet 大神帮忙,他用WinD ...
随机推荐
- Android开发实践:编译VLC-for-android
最近在Android做流媒体相关的开发,一直想学习一下强大的VLC,正好趁此机会研究研究VLC-for-android的代码,看看优秀的开源音视频播放器是如何实现的.本文总结下在Linux平台下如何编 ...
- javascript中数组和字符串的方法比较
× 目录 [1]可索引 [2]转换 [3]拼接[4]创建[5]位置 前面的话 字符串和数组有很多的相同之处,它们的方法众多,且相似度很高:但它们又有不同之处,字符串是不可变值,于是可以把其看作只读的数 ...
- java中自动装箱的问题
package wrapper; public class WrapperDemo { public static void main(String[] args) { Integer a=new I ...
- Oracle Dataguard之Real-Time Apply
Oracle Dataguard一共支持三种模式:最大可用模式(Maximum Availability),最大性能模式(Maximum Performance),最大保护模式(Maximum Pro ...
- Android基于mAppWidget实现手绘地图(一)--简介
http://lemberg.github.io/mappwidget/user_guide.html 最近在看一些导游类应用,发现一些景区的导览图使用的完全是自定义地图,也就是手绘地图.这种小范围使 ...
- 开发人员看测试之TDD和BDD
前言: 已经数月没有来园子了,写博客贵在坚持,一旦松懈了,断掉了,就很难再拾起来.但是每每看到自己博客里的博文的浏览量每天都在增加,都在无形当中给了我继续写博客的动力.最近这两天有听到Jbehave这 ...
- Activity间中使用Intent传值
主页面用来输入一个值传入第二个页面显示,关闭第二个页面返回一个值 主页布局: <RelativeLayout xmlns:android="http://schemas.android ...
- SQL Server中的事务日志管理(9/9):监控事务日志
当一切正常时,没有必要特别留意什么是事务日志,它是如何工作的.你只要确保每个数据库都有正确的备份.当出现问题时,事务日志的理解对于采取修正操作是重要的,尤其在需要紧急恢复数据库到指定点时.这系列文章会 ...
- qml基础学习 Canvas画笔
一.画布元素 自qt4.7发布qml以来,qml也在一直不断的完善中,在qt4时代使用qml时如果需要异形图,那我们只能让设计师来切图,这样的感觉是很不爽的,总感觉开发没有那么犀利.但是到了qt5这一 ...
- Wo的书单
一个人,一生之中总要有几本证明自己的书. 2016---08 <ASP.NET MVC5 高级编程(第五版)> <数据结构(C语言第二版)>