日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

使用windbg抓取崩溃文件和分析的过程

發布時間:2023/11/27 生活经验 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用windbg抓取崩溃文件和分析的过程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在軟件編程中,崩潰的場景比較常見的。且說微軟技術再牛X,也是會出現崩潰的場景。網上有一段Win98當著比爾蓋茨藍屏的視頻非常有意思。 (轉載請指明出于breaksoftware的csdn博客)
? ? ? ? 我們身邊的很多軟件都引入了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;
}
? ? ? ??這個例子是典型的多線程訪問共享變量,導致崩潰的問題。這個例子還是很清晰的,但是,如果這段邏輯揉入復雜的業務邏輯,問題的排查可能就沒那么簡單了。
? ? ? ? 那我們看下如何分析這個問題。
  1. 運行程序(程序會暫停在system(“pause”))
  2. 安裝windbg,使用“附加”功能
  3. 在windbg中輸入g,讓程序繼續執行?
  4. 在dump.exe按任意鍵,重現崩潰路徑
  5. 崩潰發生,windbg發現異常并中斷
  6. 在windbg中輸入.dump /f C:/dump.dmp,其中.dump是dump生成命令,/f是生成全信息dump,生成的dump文件會很大,C:/dump.dmp是路徑
至此,我們在客戶機器上已經抓到了完整的dmp文件,現在我們回到我們自己的電腦上,配置windbg,并分析這個dump文件。在這個配置中,我們要涉及幾塊信息的填充。一般,我們發布的產品(release版)不是在我們開發者的機器上編譯鏈接的,而是在某一個編譯鏈接服務器上。在服務器上,我們工程的目錄和我們本地的目錄極有可能是不同的。一般情況下,最容易配置不正確的是下面的第3步。
  1. 將dump.exe符號文件拷貝到你希望的保存目錄,我的目錄是F:\TmpSymbol
  2. 用!analyze –v分析dump文件
  3. ctrl+P打開windbg代碼目錄(工程根目錄)
  4. Ctrl+S打開windbg符號設置框,設置符號文件路徑,并勾選reload
這樣windbg就準確定位到異常的位置

? ? ? ? 這個流程非常適合于分析的場景是:

  1. 沒有做通過異常方式做保護的程序(否則windbg掛載后會一直陷入中斷,非常煩人。或者程序發現自己被調試,就直接退出了……)
  2. VS不便分析的dump
  3. 不破壞用戶環境(windbg是個非常小巧獨立的程序,試想如果我們給客戶裝個龐大的VS再去調試是非常難以接受的,且會破壞用戶的環境)

總結

以上是生活随笔為你收集整理的使用windbg抓取崩溃文件和分析的过程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。