Windows下崩潰問題定位辦法

       最近在使用windows下的服務器,偶爾從日誌中看到一天之中服務器上的幾個進程切換了大概有5次左右,我的第一反應就是這些進程崩潰在一天之中崩潰了5次。因爲守護進程十幾秒就拉起來了,所以本來就數量不多的用戶也感知不到。但是這個隱患不能留呀,一定要有一定的措施去處理呀。目前我使用了以下幾種辦法來做一些簡單的處理:

      1、查看系統日誌,看看是否系統日誌有記錄。基本操作就是右鍵“我的電腦”。管理——>系統工具——>事件查看器             ——>Windows日誌——>應用程序,在裏面查看錯誤這一項。基本就是如下這種的情況。

找到上面的這種基本就說明系統崩潰了,並且被記錄了。但是說句實話,這些東西沒啥用,你去百度0xc0000005根本就看不到什麼玩意,就說明什麼內存的問題。一個代碼大了,什麼都找不到。所以這個只能幫你說明你的程序確實有問題,不是人爲重啓的。我對照着這個信息和日誌,確實發現有對應的進程號切換的情況。但是5次裏面大概只有2次,所以還有3次有可能是其他原因。目前懷疑是被守護進程保活失敗殺掉之後重啓了導致的,這些在系統層面找不到原因的進程重啓,就不能使用下面的辦法了,至於到底是爲什麼,等我定位出來再說。我們着重說說那2次。

        2、想辦法找到dump文件。其實目前定位崩潰問題使用windbg直接attach上到進程上面然後等問題復現是最好的辦法,但是這會導致你時時刻刻都盯着服務器,而且一旦抓到了崩潰點你的服務器就不能用了。這個很容易被感知到的,不靠譜呀。所以就必須使用自動生成dump文件了。這個辦法主要是修改註冊表,讓系統自己生成。其實想想這個也很正常,windows都能在日誌裏面捕捉到崩潰,一定能順便把dump文件寫下來。執行腳本如下:

@echo off
echo 設置Dump...
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps"
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps" /v DumpFolder /t REG_EXPAND_SZ /d "C:\MyDump" /f
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps" /v DumpType /t REG_DWORD /d 2 /f
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps" /v DumpCount /t REG_DWORD /d 10 /f
echo Dump已經設置
pause
@echo o

這樣其實就是修改了註冊表裏面關於dump的一部分,保證在程序進行崩潰的時候,可以自動生成dump我自己實際測試過是有用的。寫了如下的代碼來實現崩潰:

int main()
{
    int i;
    cin>>i;
    return *(int*)0;
}

最後在C:\MyDump就可以看到(我使用的是win7的電腦)。

然後再使用windbg掛上pdb就可以執行了。此處不是講的重點。後面有機會,就再將一下windbg深入一點的。

好了,今天就到這裏吧。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章