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