使用AD+處理崩潰和掛起(2) (轉)

gugu99發表於2008-01-09
使用AD+處理崩潰和掛起(2) (轉)[@more@]

更多細節

沒有符號的情況:namespace prefix = o ns = "urn:schemas--com::office" />

在沒有安裝除錯符號的情況下,我們執行ADPlus.vbs,看看有什麼結果。

執行下列命令,它將導致對info.exe和其他Out-Of-Process ()應用的Full-Memory Dumps:

cscript.exe adplus.vbs -hang -iis

CScript將會輸出:

Microsoft (R) 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.

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

except for the System application.

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

Dumping process: IIS (INETINFO.EXE)

     (Process ID: 1140)

  最後有一個對話方塊報告日誌存放地點:

這時候,預設在Deging 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資訊

µ  關鍵段資訊

µ  執行緒使用情況資訊

這是肉眼看得懂的。至於高達十幾MB的DMP檔案,只有讓WinG來解釋了。

啟動Windbg,按Ctrl+D,將出現選擇“Open crash Dump”檔案對話方塊,選中上面的PID-792__INETINFO.EXE__full_2002-10-28_21-25-25-750_0318.dmp。當出現對話方塊詢問是否儲存Workspace Information時,選擇Yes。之後Windbg將會出現兩個視窗“Disembly”和“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 ADV32.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 0006ffc0info+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 Div by Zero
  • Floating Point Divide by Zero
  • Integer Overflow
  • Invalid Lock Sequence
  • Access Violation
  • Stack Overflow
  • C++ EH Exception
  • Unknown Exception

這也是一個管理員早就希望擁有的功能了吧。

總結一下,大致的使用步驟是:

u  安裝的除錯符號

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 zhengyun@tomosoft.com


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-996963/,如需轉載,請註明出處,否則將追究法律責任。

相關文章