使用windbg抓取崩溃文件和分析的过程
生活随笔
收集整理的這篇文章主要介紹了
使用windbg抓取崩溃文件和分析的过程
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
在軟件編程中,崩潰的場(chǎng)景比較常見(jiàn)的。且說(shuō)微軟技術(shù)再牛X,也是會(huì)出現(xiàn)崩潰的場(chǎng)景。網(wǎng)上有一段Win98當(dāng)著比爾蓋茨藍(lán)屏的視頻非常有意思。
(轉(zhuǎn)載請(qǐng)指明出于breaksoftware的csdn博客)
? ? ? ? 我們身邊的很多軟件都引入了dump生成和收集機(jī)制。但是一般情況下,它們都是生成minidump。因?yàn)閙inidump文件相對(duì)來(lái)說(shuō)很小,方面我們收集上來(lái)進(jìn)行分析。但是Minidump保存了很少的信息,在一些場(chǎng)景下,可能不能協(xié)助我們準(zhǔn)確快速定位問(wèn)題。
? ? ? ? 那我們看下如何分析這個(gè)問(wèn)題。
? ? ? ? 我們身邊的很多軟件都引入了dump生成和收集機(jī)制。但是一般情況下,它們都是生成minidump。因?yàn)閙inidump文件相對(duì)來(lái)說(shuō)很小,方面我們收集上來(lái)進(jìn)行分析。但是Minidump保存了很少的信息,在一些場(chǎng)景下,可能不能協(xié)助我們準(zhǔn)確快速定位問(wèn)題。
? ? ? ? 但是,如果我們?cè)跍y(cè)試過(guò)程中,發(fā)生了必現(xiàn)崩潰,而minidump又不能讓我們發(fā)現(xiàn)什么,那該怎么辦呢?我這兒舉一個(gè)例子。我們看一下代碼
// Dump.cpp : 定義控制臺(tái)應(yīng)用程序的入口點(diǎn)。
//
//
// 這是一個(gè)多線(xiàn)程訪(fǎng)問(wèn)全局變量導(dǎo)致崩潰的例子
//#include "stdafx.h"
#include <Windows.h>
#include <vector>#define INTPTR int*
typedef std::vector<INTPTR> VecINTPTR;
typedef VecINTPTR::iterator VecINTPTRIter;
typedef VecINTPTR::const_iterator VecINTPTRCIter;VecINTPTR g_VecInt;static DWORD WINAPI ReadRoutine(LPVOID)
{// 讀取線(xiàn)程for ( VecINTPTRIter it = g_VecInt.begin(); it != g_VecInt.end(); it++ ) {// 故意將讀取時(shí)間設(shè)置長(zhǎng),這樣更大概率導(dǎo)致崩潰Sleep(10);printf("%d %d\n", **it);}return 0;
}static DWORD WINAPI WriteRoutine(LPVOID)
{// 寫(xiě)入線(xiàn)程for ( VecINTPTRIter it = g_VecInt.begin(); it != g_VecInt.end(); ) {// 故意將修改時(shí)間設(shè)置短,這樣更大概率導(dǎo)致奔潰delete *it;*it = NULL;}return 0;
}int _tmain(int argc, _TCHAR* argv[])
{// 初始填充數(shù)據(jù)for ( int n = 0; n < 128; n++ ) {int* p = new int();*p = n;g_VecInt.push_back(p);}system("pause");HANDLE hRead = CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE)ReadRoutine, NULL, 0, NULL);HANDLE hWrite = CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE)WriteRoutine, NULL, 0, NULL);HANDLE hArray[] = {hRead, hWrite};WaitForMultipleObjects( ARRAYSIZE(hArray), hArray, TRUE, INFINITE);printf("Success");return 0;
}? ? ? ??這個(gè)例子是典型的多線(xiàn)程訪(fǎng)問(wèn)共享變量,導(dǎo)致崩潰的問(wèn)題。這個(gè)例子還是很清晰的,但是,如果這段邏輯揉入復(fù)雜的業(yè)務(wù)邏輯,問(wèn)題的排查可能就沒(méi)那么簡(jiǎn)單了。
? ? ? ? 那我們看下如何分析這個(gè)問(wèn)題。
- 運(yùn)行程序(程序會(huì)暫停在system(“pause”))
- 安裝windbg,使用“附加”功能
- 在windbg中輸入g,讓程序繼續(xù)執(zhí)行?
- 在dump.exe按任意鍵,重現(xiàn)崩潰路徑
- 崩潰發(fā)生,windbg發(fā)現(xiàn)異常并中斷
- 在windbg中輸入.dump /f C:/dump.dmp,其中.dump是dump生成命令,/f是生成全信息dump,生成的dump文件會(huì)很大,C:/dump.dmp是路徑
- 將dump.exe符號(hào)文件拷貝到你希望的保存目錄,我的目錄是F:\TmpSymbol
- 用!analyze –v分析dump文件
- ctrl+P打開(kāi)windbg代碼目錄(工程根目錄)
- Ctrl+S打開(kāi)windbg符號(hào)設(shè)置框,設(shè)置符號(hào)文件路徑,并勾選reload
? ? ? ? 這個(gè)流程非常適合于分析的場(chǎng)景是:
- 沒(méi)有做通過(guò)異常方式做保護(hù)的程序(否則windbg掛載后會(huì)一直陷入中斷,非常煩人?;蛘叱绦虬l(fā)現(xiàn)自己被調(diào)試,就直接退出了……)
- VS不便分析的dump
- 不破壞用戶(hù)環(huán)境(windbg是個(gè)非常小巧獨(dú)立的程序,試想如果我們給客戶(hù)裝個(gè)龐大的VS再去調(diào)試是非常難以接受的,且會(huì)破壞用戶(hù)的環(huán)境)
總結(jié)
以上是生活随笔為你收集整理的使用windbg抓取崩溃文件和分析的过程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 一个分析“文件夹”选择框实现方法的过程
- 下一篇: 打开,保存文件框的文本溢出排查