在没有安装调试符号的情况下,我们运行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使用情况信息
这是肉眼看得懂的。至于高达十几MB的DMP文件,只有让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
上面的输出可以大致分为三列内容:
其他可以尽情练习的命令有:
Ø ~*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。
它能监视的异常有:
这也是一个管理员早就希望拥有的功能了吧。
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+已经被扩展,而不仅仅限于拯救IIS和COM+,一般的应用和服务也完全支持。
Written by [email protected]
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=12709