Windows下获取Dump文件以及进程下各线程调用栈的方法总结

标签: windows dump 文件 | 发表时间:2013-12-07 18:52 | 作者:iihero
出处:http://blog.csdn.net

1. Dump文件的用途

Dump文件, 主要用于诊断一个进程的运行状态,尤其是碰到崩溃(Crash)或者挂起(hang)不响应时,需要分析它的工作状态.  除了平时常见的attach到这个进程, 分析Dump文件就成了一个重要的手段了.

相信一些做软件维护和支持的工程师在这方面深有体会, 比如某天某时,客户说, 呀, 糟糕, 服务器进程挂掉了, 怎么回事? 然后,看看了日志文件,也没有什么可用的信息.  技术支持告诉他, 按某步骤生成一个dump文件来看看......

2. 如何生成Dump文件, 如何获取调用栈

生成dump文件, 可以按照进程的状态要求, 分两种情况:
1) 这个进程并不会Crash, 它一直处于运行状态, 
    那么如何在不终止进程的情况下抓取dump文件呢?Debugging Tools for Windows里提供了一个非常好的工具,adplus.vbs。从名字可以看出,实际上是一个vb脚本,只是对cdb调试器作的一个包装脚本。
    其路径与Debugging Tools for Windows的安装路径相同,使用的方法也很简单,如下所示:
     adplus.vbs -hang -p 1234 -o d:/dump
     其中-hang指明使用hang模式,亦即在进程运行过程中附加上去snapshot抓取一个dump文件,完成之后detach。 
     使用sysinternals中的procdump命令,一样可以得到运行状态的的进程的dump文件:
     如:
procdump -s 20 -n 1 OBMO.exe c:\OBMO.dmp
procdump -s 20 -n 1 AMPService.exe c:\AMPService.dmp
procdump -s 20 -n 1 OBServiceManager.exe c:\OBServiceManager.dmp
procdump -s 20 -n 1 MlSrvWrapper.exe c:\MlSrvWrapper.dmp
procdump -s 20 -n 1 AdminWebServices.exe c:\AdminWebServices.dmp

      
 
2) 进程起来之后,很快就会Crash, 要获取它Crash时的dump文件
     与之对应的是-crash崩溃模式,用户先启动adplus,然后由它启动要监控的程序,在出现异常崩溃时自动生成dump文件,或者通过Ctrl-C人为发出抓取指 令。但是-crash模式在抓取完成之后,被监控的进程就必须终止。因此我们在这里只选用-hang模式。
-p是要调试的进程ID,-o 指定要output的dump文件路径。另外,与adplus类似的,有个UserDump工具,但是抓取用户模式的进程,而adplus则是内核模式和用户模式两者皆可。

     再就是使用Dr. Waston工具自动创建dump文件 (Crash的时候)
【抓dump】
1、一般抓法
adplus -hang -p 3230 -quiet 抓3230 pid进程,hang模式,相当于把那个进程暂停住,取内存快照
adplus -crash -pn w3wp -quiet 抓w3wp进程,crash模式,当那个进程崩溃结束的时候自动抓取当时的内存
adplus -hang -iis -quiet 抓IIS相关进程,包括其上host的web应用,以及iis自身
2、抓window服务
http://support.microsoft.com/kb/824344/zh-cn
3、远程抓
http://blog.joycode.com/tingwang/archive/2006/08/11/79763.aspx
4、抓蓝屏和死机的dump
电脑无故重启或者蓝屏会在C:\WINDOWS\Minidump\下保存一个minidump,但是这个minidump可用的命令很少,一般只打!analyze –v看到是哪个进程引起的,还有相关的驱动模块就基本定位问题了。
5、IIS回收的时候抓
http://blog.yesky.com/blog/omakey/archive/2006/12/17/1618015.html
6、计划任务抓
比如一个进程起来后不知道它什么时候会意外崩溃,可以在计划任务里用crash里抓,当那个进程意外终止的时候,cdb可以直接附加上去,抓取当时的dump,如果要抓一些会自动重启的进程,而且要抓每次重启前的dump,可以参考附录里一节。

3. 如何分析Dump文件

【常用命令】

1、先path C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727,把.net路径设置为path环境变量,一遍在windbg里可以直接.load sos,而不必.load C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\sos.dll
2、ld demo,加载你程序的pdb文件,调试.net程序一般要把kernel32和mscorwks的符号加载上,关于这两个东西大家可以查资料,尤其是后者有哪些函数可以多了解一些。
3、在windbg的file/symbol file path对话框里输入以下文字,以便自动加载和下载符号
C:\WINDOWS\Symbols;d:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\symbols;.sympath SRV*d:\localsymbols*http://msdl.microsoft.com/download/symbols
其中有windows、.net2.0和自动从网上下载的调试符号,注意根据自己的情况适当修改目录

【调试死锁】
1、!syncblk,查看哪些线程拿到了锁
2、~67e!clrstack 跳到某个拿到锁的线程看它正在干什么操作,迟迟不肯释放锁
3、!runaway 查看这个占有锁的线程运行了多长时间。
4、~*e!clrstack查看所有线程的托管堆栈,看看哪些是正在等待锁的,比如hang在System.Threading.Monitor.Enter(System.Object) 
5、~136s选择该线程,显示如下
0:000> ~136s eax=00005763 ebx=08deeb5c ecx=03eff0d4 edx=5570ab69 esi=08deeb5c edi=7ffd6000 eip=7c95ed54 esp=08deeb10 ebp=08deebb8 iopl=0 nv up ei pl zr na pe nc cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000246 ntdll!KiFastSystemCallRet: 7c95ed54 c3 ret
找到ecx寄存器的值,复制后ctrl+f,向上查找,会找到!syncblk的地方,如下
0:000> !syncblk Index SyncBlock MonitorHeld Recursion Owning Thread Info SyncBlock Owner 1906 03ee4be4 5 1 03ee8f88 22c8 67 185e2ef0 System.Object 5390 052ca39c 3 1 05292b30 1dd4 49 1060d3ac System.Object 9372 0530702c 15 1 0012d3a8 1aa8 80 185e7704 System.Object 11428 03eff0d4 35 1 053b8fa8 169c 120 166acd98 System.Object 15278 0531c6b4 61 1 06bc1430 26d8 86 1a5bea88 System.Object
可以看到136线程等待的锁被120号线程占着不放(格式有点乱,凑合看),
6、有时候通过ecx寄存器找锁不是很确定,可以用~* kb来把所有线程堆栈打出来,然后根据!syncblk出来的同步快的值去搜索大概有多少个线程在等那个锁。因为同样是等待锁,可等的状态不一样,有的在Q里,有的锁已经升级,有的去尝试去拿锁了,所以不一定当时ecx寄存器指向那块内存,具体如何找到某个正在等待锁的线程等待的锁的内存地址,以及它正等待的这个锁被哪个线程拿着,我还没琢磨出规律来,但一般情况下,如果有其它同步对象的话,更难查。.net里用我上面说的几步就能查出锁的问题了。

更详细的内容,可以参照这篇文章: http://www.cppblog.com/tgh621/archive/2010/10/27/131525.html

4.  获取调用栈

这里,可以使用几个工具:
1. 使用StraceNT这个trace工具

StraceNT - A System Call Tracer for Windows 

http://www.intellectualheaven.com/default.asp?BH=projects&H=strace.htm 

2. 直接使用procexp.exe也可以看到进程的调用栈信息,如果符号库比较全,则调用栈很清晰.
3. MSE (Managed Stack Explorer)
    这个工具对于dotnet进程非常实用.http://mse.codeplex.com/, 直接可以看到dotnet进程的托管栈细节.

工具基本上也就这么多了,具体分析还得看怎么用.

  


作者:iihero 发表于2013-12-7 10:52:32 原文链接
阅读:35 评论:0 查看评论

相关 [windows dump 文件] 推荐:

Windows下获取Dump文件以及进程下各线程调用栈的方法总结

- - CSDN博客推荐文章
Dump文件, 主要用于诊断一个进程的运行状态,尤其是碰到崩溃(Crash)或者挂起(hang)不响应时,需要分析它的工作状态.  除了平时常见的attach到这个进程, 分析Dump文件就成了一个重要的手段了. 相信一些做软件维护和支持的工程师在这方面深有体会, 比如某天某时,客户说, 呀, 糟糕, 服务器进程挂掉了, 怎么回事.

jstack Dump 日志文件分析

- - Web前端 - ITeye博客
jstack Dump 日志文件中的线程状态. dump 文件里,值得关注的线程状态有:. Deadlock(重点关注) . 执行中,Runnable   . Waiting on condition(重点关注) . Waiting on monitor entry(重点关注). 暂停,Suspended.

jmap转换gcore的dump文件

- - 开源软件 - ITeye博客
使用gdb生成gcore快照文件. sudo gdb -q --pid=4990 【此处省略乱七八糟的输出内容】. --pid后面跟着的是jvm的进程id. 这里调用命令生成gcore的dump文件. detach是用来断开与jvm的连接的. quit简单了,退出gdb模式. 用jmap转换gcore的dump文件变成hprof.

gdb调试和core dump文件的生成

- -
1、生成core dump文件的方法:.   $  ulimit -c //查看是否为0.     这样在程序崩溃以后会在当前目录生成一个core.xxxx的文件. 2、调试core dump文件.     生成了core.xxx文件以后.   $  gdb ./应用程序  core.xxxx.   就会恢复现场到你的程序崩溃的那一刻.

Linux上Core Dump文件的形成和分析

- - CSDN博客推荐文章
Core,又称之为Core Dump文件,是Unix/Linux操作系统的一种机制,对于线上服务而言,Core令人闻之色变,因为出Core的过程意味着服务暂时不能正常响应,需要恢复,并且随着吐Core进程的内存空间越大,此过程可能持续很长一段时间(例如当进程占用60G+以上内存时,完整Core文件需要15分钟才能完全写到磁盘上),这期间产生的流量损失,不可估量.

使用MAT(Memory Analyzer Tool)工具分析dump文件

- -
《使用MAT(Memory Analyzer Tool)工具分析dump文件》. 生产环境中,尤其是吃大内存的JVM,一旦出现内存泄露等问题是非常容易引发OutofMemory的,如果没有一个好的工具提供给开发人员定位问题和分析问题,那么这将会是一场 噩梦. 目前JDK其实自带有一些内存泄露分析工具专门用于帮助开发人员定位内存泄露等问题,但是这些工具往往并不是能够满足一些现状,这里笔者所指的现状更多是迅速、便捷、高效的定位出问题,方便开发人员迅速进行调整.

容器下 -XX:+HeapDumpOnOutOfMemoryError 未生成 dump 文件的问题

- - coderbee笔记
JVM 的启动命令一般都会加上参数 -XX:+HeapDumpOnOutOfMemoryError=/path/to/save/dump.hprof,用于在 JVM 发生 OOM 时自动生成内存 dump 文件. 应用在生产环境是运行在 Docker 容器里、由 K8S 负责管理容器. 但是有的应用发生 OOM 时,在 /path/to/save/dump.hprof 路径下并没有生成对应的 dump 文件.

centos7使用lldb调试netcore应用转储dump文件 - czd890 - 博客园

- -
centos7下安装lldb,dotnet netcore 进程生成转储文件,并使用lldb进行分析. 随着netcore应用在linux上部署的应用越来越多,碰到cpu 100%,内存暴涨的情况也一直偶有发生,在windows平台下进程管理器右键转储,下载到本地使用windbg或者直接vs分析都比较方便.

Windows IIS日志文件分析程序

- bababubuliku - 月光博客
  Windows Server具有事件日志记录的功能,其IIS日志文件里记录了包括下列信息:谁访问了您的站点,访问者查看了哪些内容等等. 通过定期检查这些日志文件,网站管理员可以检测到服务器或站点的哪些方面易受攻击或存在其他安全隐患.   不过,目前的日志分析工具并不是很完善,有些功能并不具备,特别是针对某个URL地址进行攻击的分析并不多,下面是一个VB Script程序,保存为VBS程序后可以在服务器上运行,用于分析和检测IIS日志里针对某个URL地址进行攻击的IP地址.

Windows 8改进文件传输体验

- Homer - Solidot
多年来,Windows资源管理器对话框一直在兢兢业业的计算完成一个大文件复制或删除操作需要花多长时间. 然而,剩余时间对话框经常会让人摸不着头脑,它会从几小时跳到几分钟再跳到几秒钟,仿佛虚无般的缥缈. 现在,在Windows 8中,你将不会有类似体验了,因为微软取消了剩余时间估计. Windows项目经理Alex Simmons在Building Windows 8博客上介绍新一代操作系统在文件管理上的改进:所有复制任务都展示在同一对话框内;用完成传输的比率取代剩余时间估计,但用户可以点击“更多细节”了解完成任务的剩余时间、传输速率和剩余传输大小.