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使用方法

介绍一个好用的抓取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 - 

如果不配置,使用命令的时候会提示错误,比如:

0:000> .loadby sos clrjit
0:000> !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 文件。

输入下面的命令:

0:000> .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 

这里不用管,这个文件夹后面可以生成。

0:000> .symfix
0:000> .symfix+ c:\symbols
0:000> .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命令:

0:000> .reload
................................................................
................................................................
............

接着执行下面:

0:000> .loadby sos clr
0:000> !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 目录下面。

再次执行这几个命令:

0:000> .reload
................................................................
................................................................
............
0:000> .loadby sos clr
0:000> !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 没有加载正确,用下面的命令:

0:000> .load c:\symbols\sos.dll
0:000> .loadby sos clr
0:000> !tp

这里load命令必须带SOS.dll的路径。加载了它,然后执行 .loadby sos clr ,表示调试.NET托管程序。

开始漫长的等待,程序窗口提示:

*BUSY* Downloading symbols for [clr.pdb] /

等到相关的符号文件全部下载完毕,终于出现了久违的成功界面:

CPU utilization: 11%
Worker Thread: Total: 8 Running: 0 Idle: 8 MaxLimit: 32767 MinLimit: 8
Work Request in Queue: 0
--------------------------------------
Number of Timers: 14
--------------------------------------
Completion Port Thread:Total: 1 Free: 1 MaxFree: 16 CurrentLimit: 0 MaxLimit: 1000 MinLimit: 8

4,获取帮助信息

有关WinDbg详细的调试命名,可以参考下面文章: windbg调试命令 http://www.cnblogs.com/kekec/archive/2012/12/02/2798020.html

或者,你也可以随时用帮助,查看如何使用:

0:000> !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命令,这个不一样,这里列出部分命令:

0:000> .help
. commands:
   .allow_exec_cmds [0|1] - control execution commands
   .allow_image_mapping [0|1] - 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文件生成,调试环境配置,还有帮助命令,现在总算是入门了。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏流柯技术学院

Tomcat中JVM内存溢出及合理配置

Tomcat本身不能直接在计算机上运行,需要依赖于硬件基础之上的操作系统和一个Java虚拟机。Tomcat的内存溢出本质就是JVM内存溢出,所以在本文开始时,应...

20020
来自专栏程序员互动联盟

linux设备驱动第四篇:linux驱动调试方法

上一篇我们大概聊了如何写一个简单的字符设备驱动,我们不是神,写代码肯定会出现问题,我们需要在编写代码的过程中不断调试。在普通的c应用程序中,我们经常使用prin...

594150
来自专栏草根专栏

使用Identity Server 4建立Authorization Server (5)

之前的配置都是在内存中, 下面将如何把这些数据存储到Sql Server数据库, 这样更适合生产环境. 这部分基本完全参考官方文档: https://ident...

40150
来自专栏java、Spring、技术分享

java 日志处理

  common-logging是 apache提供的一个通用的日志接口。用户可以自由选择第三方的日志组件作为具体实现,像log4j,或者jdk自带的loggi...

47330
来自专栏乐沙弥的世界

基于Linux (RHEL 5.5) 安装Oracle 10g RAC

    本文所描述的是在Red Hat 5.5下使用vmware server 来安装Oracle 10g RAC(OCFS + ASM),本文假定你的RHEL...

17130
来自专栏Java面试通关手册

结合Spring发送邮件的四种正确姿势,你知道几种?

测试使用的环境是企业主流的SSM 框架即 SpringMVC+Spring+Mybatis。为了节省时间,我直接使用的是我上次的“SSM项目中整合Echarts...

15630
来自专栏用户2442861的专栏

使用IntelliJ IDEA开发SpringMVC网站(四)用户管理

转载请注明出处:Gaussic(一个致力于AI研究却不得不兼顾项目的研究生) 。

28410
来自专栏IT笔记

SpringBoot开发案例之整合ActiveMQ实现秒杀队列

在实际生产环境中中,通常生产者和消费者会是两个独立的应用,这样才能通过消息队列实现了服务解耦和广播。因为此项目仅是一个案例,为了方便期间,生产和消费定义在了同一...

2.3K40
来自专栏芋道源码1024

分布式消息队列 RocketMQ源码解析:事务消息

本文主要基于 RocketMQ 4.0.x 正式版 1. 概述 2. 事务消息发送 2.1 Producer 发送事务消息 2.2 Broker 处理结束事务请...

56960
来自专栏FreeBuf

深入解析新型加密货币挖矿恶意软件ZombieBoy

延续了2018年加密货币挖矿恶意软件的趋势,我发现了另一种类似于5月初发现的“MassMine”的挖矿恶意软件。我把这个家族称为ZombieBoy,因为它使用了...

14120

扫码关注云+社区

领取腾讯云代金券