使用ProcDump工具解决Windows应用程序崩溃或者终止

日期: 2010-01-03 作者:Bruce Mackenzie-Low翻译:刘波 来源:TechTarget中国 英文

ProcDump是一个可以用于诊断多种问题点的命令行工具。和Dr.Watson、ADPlus以及DebugDiag一样,ProcDump可以在不期望的情况或者异常发生时,用于俘获一个进程的内存转储。而且也同ADPlus以及DebugDiag一样,它可以对一个挂起的应用程序强制进行进程转储。但和之前的任何工具不同的是,ProcDump可以在CPU的活动峰值达到一个指定的级别时,对一个进程进行转储。

这对于那些间歇性的性能问题是特别有用的,对于这种问题,其发生是很难预测的。   ProcDump包括一个单独的可执行文件(procdump.exe),而这个文件可以接受多种不同的参数。当不带任何参数时,……

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

ProcDump是一个可以用于诊断多种问题点的命令行工具。和Dr.Watson、ADPlus以及DebugDiag一样,ProcDump可以在不期望的情况或者异常发生时,用于俘获一个进程的内存转储。而且也同ADPlus以及DebugDiag一样,它可以对一个挂起的应用程序强制进行进程转储。但和之前的任何工具不同的是,ProcDump可以在CPU的活动峰值达到一个指定的级别时,对一个进程进行转储。这对于那些间歇性的性能问题是特别有用的,对于这种问题,其发生是很难预测的。

  ProcDump包括一个单独的可执行文件(procdump.exe),而这个文件可以接受多种不同的参数。当不带任何参数时,ProcDump工具会在保持应用程序执行的情况下,强制进行一个内存转储。例如,如下的命令会强制对微软Outlook应用程序进行转储,获取其内存的内容,并放到outlook.dmp文件中。

  C:> procdump outlook.exe

  默认情况下,对进程内存的转储只会获取线程和句柄信息。而当使用参数-ma时,会执行一个完整的进程内存转储。这样就可以让调试器识别到应用程序的更多信息,包括线程环境(!teb)、进程环境(!peb)以及锁信息(!locks –v),就像下图中,winword.exe的调试器输出那样。

图1

ProcDump工具

     通过使用-h参数,ProcDump会检测一个挂起的Windows应用程序,并强制进行内存转储。这与ADPlus和DebugDiag中的功能很相似。使用-e参数可以使得ProcDump去检测应用程序的一个未处理的异常,并获取进程转储。通过接下来对进程转储的分析,您可以弄清哪些程序、DLL以及错误情况在中断时发生了。这可以让您通过在网上进行智能的搜索,找到相似的场景,以便确定是否发生了一个已知的问题点,或者您是否需要和卖方进行联系。

  让ProcDump和之前的工具与众不同的是,它可以检测CPU峰值,并在达到时,收集进程转储。对于别人无法干预的间歇性问题,这是非常有用的。有三个参数可以实现这一功能:

-c 在产生一个进程转储前,指定CPU达到的阈值。

-s 指定达到该阈值的持续时间秒数

-u 指定CPU为单核

  为了说明其使用方法,让我们来看一个简单的例子。下面的第一个命令会开启一个独立的窗口,并在该窗口执行一个遍历系统磁盘的目录命令。然后,您可以使用tlist命令去快速地找到PID(进程ID)。最后,使用ProcDump命令去指定在PID 1432上(在这个例子中)CPU阈值为10%,持续时间为至少2秒时会产生一个进程转储。

C:> start "dir window" dir /s c:

C:> tlist
[…]
1432 cmd.exe     dir window - dir /s c:

C:> procdump -c 10 -s 2 1432

ProcDump v1.4 - Writes process dump files
Copyright (C) 2009 Mark Russinovich
Sysinternals - www.sysinternals.com

Process: cmd.exe (1432)
CPU threshold: 10% of system
Duration threshold: 2s
Number of dumps: 1
Hung window check: Disabled
Exception monitor: Disabled
Dump file:         D:KitsProcDumpv1.4cmd.dmp

Time       CPU   Duration
[12:09.18] 15%   1s
[12:09.19] 10%   2s

Process has hit spike threshold.
Writing dump file D:KitsProcDumpv1.4cmd_091709_120919PM.dmp...
Dump written.

  当然,这是有关其使用的一个不切实际的例子。因为实际上,应该指定一个更长时间,以及一个更高的CPU阈值,以便防止间歇性的CPU峰值。但这是一个简单的示例,以展示这些参数是怎样一起被使用的,比便触发一个进程转储。

  一旦进程转储已经被写入,您就可以使用Windbg去分析其内容。可以从下图中看到,调试器标注,一个进程占用了超过10%的CPU时间,并持续了2秒,并显示了其线程ID(0xc2c)。线程ID是很重要的,因为一个进程可能有多个线程。所以你应该集中到造成CPU峰值的线程的堆栈模式。

图2

ProcDump

  最后,通过对调试器发出~*kv命令,会显示所有线程的堆栈模式,并同时提供被执行的函数的名字。在下面的例子中,您可以看到,目录命令是怎样去执行多种功能,像cmd!FileIsConsole、 cmd!WriteEol、cmd!NewDisplayFile 以及 cmd!WalkTree。尽管这些功能名对我们来说没有什么意义,但我们可以用它们作为关键词,在网络上去搜索针对我们失控进程的可能解决方案。

图3

ProcDump工具
 
  就像您所看到的,有很多免费的工具可以被用作对应用程序崩溃和挂起的诊断。我们介绍了Dr. Watson、ADPlus、 DebugDiag 以及 ProcDump都是怎么去获取进程转储。然后,通过使用Windbg,您可以对转储进行分析,并查看崩溃场景中的当前线程,或者被ProcDump所识别的失控线程的堆栈模式。

相关推荐