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

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 人文社科 > 生活经验 >内容正文

生活经验

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

發(fā)布時(shí)間:2023/11/27 生活经验 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用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)題。

? ? ? ? 但是,如果我們?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)題。
  1. 運(yùn)行程序(程序會(huì)暫停在system(“pause”))
  2. 安裝windbg,使用“附加”功能
  3. 在windbg中輸入g,讓程序繼續(xù)執(zhí)行?
  4. 在dump.exe按任意鍵,重現(xiàn)崩潰路徑
  5. 崩潰發(fā)生,windbg發(fā)現(xiàn)異常并中斷
  6. 在windbg中輸入.dump /f C:/dump.dmp,其中.dump是dump生成命令,/f是生成全信息dump,生成的dump文件會(huì)很大,C:/dump.dmp是路徑
至此,我們?cè)诳蛻?hù)機(jī)器上已經(jīng)抓到了完整的dmp文件,現(xiàn)在我們回到我們自己的電腦上,配置windbg,并分析這個(gè)dump文件。在這個(gè)配置中,我們要涉及幾塊信息的填充。一般,我們發(fā)布的產(chǎn)品(release版)不是在我們開(kāi)發(fā)者的機(jī)器上編譯鏈接的,而是在某一個(gè)編譯鏈接服務(wù)器上。在服務(wù)器上,我們工程的目錄和我們本地的目錄極有可能是不同的。一般情況下,最容易配置不正確的是下面的第3步。
  1. 將dump.exe符號(hào)文件拷貝到你希望的保存目錄,我的目錄是F:\TmpSymbol
  2. 用!analyze –v分析dump文件
  3. ctrl+P打開(kāi)windbg代碼目錄(工程根目錄)
  4. Ctrl+S打開(kāi)windbg符號(hào)設(shè)置框,設(shè)置符號(hào)文件路徑,并勾選reload
這樣windbg就準(zhǔn)確定位到異常的位置

? ? ? ? 這個(gè)流程非常適合于分析的場(chǎng)景是:

  1. 沒(méi)有做通過(guò)異常方式做保護(hù)的程序(否則windbg掛載后會(huì)一直陷入中斷,非常煩人?;蛘叱绦虬l(fā)現(xiàn)自己被調(diào)試,就直接退出了……)
  2. VS不便分析的dump
  3. 不破壞用戶(hù)環(huán)境(windbg是個(gè)非常小巧獨(dú)立的程序,試想如果我們給客戶(hù)裝個(gè)龐大的VS再去調(diào)試是非常難以接受的,且會(huì)破壞用戶(hù)的環(huán)境)

總結(jié)

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

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。