现在的位置: 首页 > 综合 > 正文

使用AD+处理崩溃和挂起(2)

2013年05月30日 ⁄ 综合 ⁄ 共 5233字 ⁄ 字号 评论关闭

更多细节

没有安装调试符号的情况

在没有安装调试符号的情况下,我们运行ADPlus.vbs,看看有什么结果。

运行下列命令,它将导致对Inetinfo.exe和其他Out-Of-Process (OOP)应用程序的Full-Memory Dumps

cscript.exe adplus.vbs -hang -iis

CScript将会输出:

Microsoft (R) Windows Script Host Version 5.6

Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.

以及一个对话框提示你安装调试符号:

 

对话框上建议您安装好调试符号后,新建一个环境变量“_NT_SYMBOL_PATH”保存调试符号的安装路径。

然后,让我们继续:

The '-hang' switch was used, Autdoump is running in 'hang' mode.

 

Dumping process info for IIS 5.x and all COM+ server applications

except for the System application.

----------------------------------------------------------------------

Dumping process: IIS (INETINFO.EXE)

                         (Process ID: 1140)

       最后有一个对话框报告日志存放地点:

 

这时候,默认在Debugging Tools For Windows安装路径下新建了一个目录,它的名字类似于这样“Normal_Hang_Mode__Date_10-28-2002__Time_21-25-1919”。下面是Dump的内容:

MemoryDump文件

PID-792__INETINFO.EXE__full_2002-10-28_21-25-25-750_0318.dmp

和相应的说明PID-792__INETINFO.EXE__Date_10-28-2002__Time_21-25-1919.log

说明文件中会依次给出以下信息:

µ       Autodump+启动的时间

µ       操作系统信息

µ       运行计算机名

µ       堆栈信息

µ       句柄信息

µ       线程堆栈遍历信息

µ       加载的模块信息

µ       DLL信息

µ       关键段信息

µ       线程CPU使用情况信息

这是肉眼看得懂的。至于高达十几MBDMP文件,只有让WinDBG来解释了。

启动Windbg,按Ctrl+D,将出现选择“Open crash Dump”文件对话框,选中上面的PID-792__INETINFO.EXE__full_2002-10-28_21-25-25-750_0318.dmp。当出现对话框询问是否保存Workspace Information时,选择Yes。之后Windbg将会出现两个窗口“Disassembly”和“Command”。这里我们不需要“Disassembly”窗口,关掉它。

Command”窗口将会告诉你,当Dump进行时,Active Thread在做什么。

由于我们没有安装调试符号,所以只能遗憾地看到:

Symbol search path is: *** Invalid *** : Verify _NT_SYMBOL_PATH setting

Executable search path is:

..................................................................

Wake debugger - code 80000007 (!!! second chance !!!)

eax=00000001 ebx=00000000 ecx=0027aa80 edx=00000000 esi=00000000 edi=00000068

eip=77f8fb68 esp=0006f8a0 ebp=0006f910 iopl=0         nv up ei pl zr na po nc

cs=001b  ss=0023  ds=0023  es=0023  fs=0038  gs=0000             efl=00000246

*** ERROR: Symbol file could not be found.  Defaulted to export symbols for ntdll.dll -

ntdll!NtReadFile+b:

77f8fb68 c22400           ret     0x24

*** ERROR: Symbol file could not be found.  Defaulted to export symbols for ADVAPI32.dll

这时,输入命令“kb”,这是召唤线程堆栈信息的符咒。你可以查看Windbg帮助,那里写得很明白:KB(Display Stack Backtrace)B就是显示传入每一个函数的前三个参数。输出如下所示:

0:000> kb

ChildEBP RetAddr  Args to Child             

WARNING: Stack unwind information not available. Following frames may be wrong.

0006f910 77da86d3 00000068 0006f9d8 00000216 ntdll!NtReadFile+0xb

0006f93c 77da9431 00000068 0006f9d8 00000216 ADVAPI32!SetSecurityDescriptorSacl+0x4c

0006f9b8 77d929f7 00000068 0006f9d8 00000216 ADVAPI32!StartServiceCtrlDispatcherW+0x34d

0006fbf4 01002884 00279390 010040c8 00000000 ADVAPI32!StartServiceCtrlDispatcherA+0x72

0006fd30 01001e94 002d7f98 00000024 0006ffc0 inetinfo+0x2884

77dfdbee 2474ff50 2474ff0c fb93e80c 55c3ffff inetinfo+0x1e94

0c24448d 00000000 00000000 00000000 00000000 0x2474ff50

上面的输出可以大致分为三列内容:

  • ChildEBP (1)

  • RetAddr (2)

  • Args to Child (3~ 5)

其他可以尽情练习的命令有:

Ø         ~*kb: ~*代表对于所有的线程应用后面的kb动作

Ø         !locks : show all critical sections (这样你就可以看到挂起时哪一个线程在等待了)

Ø         lm -- List Modules loaded in the Process dump

Ø         dc -- Dump address 

这几个命令都是重点推荐的,不可不试!

 

安装调试符号的情况

以上介绍的是没有安装调试符号的情况,我们来看一看安装了之后有什么不同。

首先,安装调试符号。

其次,最好新建一个环境变量:

 

重新打开Windbg

这次Windbg加载了Dmp文件之后,就会报告找到了调试符号:

Symbol search path is: D:/NTSymbols

Executable search path is:

............................................

Wake debugger - code 80000007 (!!! second chance !!!)

eax=00000004 ebx=00000000 ecx=00000000 edx=00000000 esi=00000000 edi=0000006c

eip=77f82861 esp=0006f8a0 ebp=0006f910 iopl=0         nv up ei pl zr na po nc

cs=001b  ss=0023  ds=0023  es=0023  fs=0038  gs=0000             efl=00000246

*** WARNING: symbols timestamp is wrong 0x3af357eb 0x38175b30 for ntdll.dll

ntdll!_output+567:

77f82861 c22400           ret     0x24

*** WARNING: symbols timestamp is wrong 0x3c1aab1e 0x385134fe for ADVAPI32.dll

我们来比较一下“~*kb”命令在两种情况下的区别:

没有安装调试符号情况下:

   4  id: 420.484   Suspend: 1 Teb 7ffda000 Unfrozen

*** ERROR: Symbol file could not be found.  Defaulted to export symbols for RPCRT4.DLL -

ChildEBP RetAddr  Args to Child             

WARNING: Stack unwind information not available. Following frames may be wrong.

0119ff74 77d375ec 77d37a82 00280068 00270000 ntdll!ZwReplyWaitReceivePortEx+0xb

0119ffa8 77d379a0 0027b898 0119ffec 77e76523 RPCRT4!RpcBindingSetOption+0x6e9

0119ffb4 77e76523 0028f788 00270000 50000161 RPCRT4!RpcBindingSetOption+0xa9d

0119ffec 00000000 77d37988 0028f788 00000000 KERNEL32!TlsSetValue+0x115

安装了调试符号:

   4  id: 420.484   Suspend: 1 Teb 7ffda000 Unfrozen

ChildEBP RetAddr  Args to Child             

0119ff74 77d375ec 77d37a82 00280068 00270000 ntdll!memmove+0x14

0119ffa8 77d379a0 0027b898 0119ffec 77e76523 RPCRT4!LOADABLE_TRANSPORT::LOADABLE_TRANSPORT+0x97

0119ffb4 77e76523 0028f788 00270000 50000161 RPCRT4!ReadSeed+0x11

0119ffec 00000000 77d37988 0028f788 00000000 KERNEL32!CreateThread+0x13

也就是说,微软警告你没有调试符号的情况下,可能会被一个错误的堆栈误导。很明显,两种情况下堆栈展开的也不一样。所以我们强烈建议您安装调试符号。

处理崩溃的触发模式

能够自动处理Crash情况,也是AD+让人激赏的功能之一。你可以配置ADPlus,让它一直运行,当发生异常时,选择几种方式处理:用信使服务通知管理员,或者自动Dump memory

它能监视的异常有:

  • Invalid Handle

  • Illegal Instruction

  • Integer Divide by Zero

  • Floating Point Divide by Zero

  • Integer Overflow

  • Invalid Lock Sequence

  • Access Violation

  • Stack Overflow

  • C++ EH Exception

  • Unknown Exception

这也是一个管理员早就希望拥有的功能了吧。

总结一下,大致的使用步骤是:

u      安装Windows2000的调试符号

u      安装Windows2000 SP1的调试符号

u      安装Windows2000 SP2的调试符号

u      新建环境变量“_NT_SYMBOL_PATH

u      安装Microsoft Debugging Tools for Windows最新版本

u      IIS Hang时,运行脚本cscript.exe adplus.vbs -hang -iis

u      Windbg加载dmp文件,运用各种命令组合观察。

值得注意的是,AD+已经被扩展,而不仅仅限于拯救IISCOM+,一般的应用和服务也完全支持。

 

Written by zhengyun@tomosoft.com

 

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=12709

抱歉!评论已关闭.