Windbg生成dump檔案的方法:
程式崩潰(crash)的時候, 為了以後能夠除錯分析問題, 可以使用WinDBG要把當時程式記憶體空間資料都儲存下來,生成的檔案稱為dump 檔案。 步驟:
1) 開啟WinDBG並將之Attach 到crash的程式程序
2) 輸入產生dump 檔案的命令
WinDBG產生dump 檔案的命令是 .dump ,可以選擇不同的引數來生成不同型別的dump檔案。
選項(1): /m
命令列示例:.dump /m C:\dumps\myapp.dmp
註解: 預設選項,生成標準的minidump, 轉儲檔案通常較小,便於在網路上透過郵件或其他方式傳輸。 這種檔案的資訊量較少,只包含系統資訊、載入的模組(DLL)資訊、 程序資訊和執行緒資訊。
選項(2): /ma
命令列示例:.dump /ma C:\dumps\myapp.dmp
註解: 帶有儘量多選項的minidump(包括完整的記憶體內容、控制代碼、未載入的模組,等等),檔案很大,但如果條件允許(本機除錯,區域網環境), 推薦使用這中dump。
選項(3):/mFhutwd
命令列示例:.dump /mFhutwd C:\dumps\myapp.dmp
註解:帶有資料段、非共享的讀/寫記憶體頁和其他有用的資訊的minidump。包含了透過minidump能夠得到的最多的資訊。是一種折中方案
那怎麼自動生成dump檔案呢,比如對方的電腦沒有windbg,這裡用到一個window系統自帶工具,Dr.Watson
執行方式很簡單:
直接run-輸入drwtsn32 -i就可以了,會提示這樣的:
這個命令真難記,實話,記華生醫生吧,福爾摩斯中的
如果有程式崩潰,會自動生成dump,這時再輸入drwtsn32就會執行這個程式:
找到對應路徑的DMP檔案就行了,一般放在如下路徑:
C:\Documents and Settings\All Users\Application Data\Microsoft\Dr Watson
以下例項來自AWD
程式碼:
Copyright (c) Advanced Windows Debugging (ISBN 0321374460) from Addison-Wesley Professional. All rights reserved.
THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
PURPOSE.
--*/
#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include <conio.h>
VOID SimulateMemoryCorruption ( ) ;
class CAppInfo
{
public:
CAppInfo(LPWSTR wszAppName, LPWSTR wszVersion)
m_wszAppName=wszAppName;
m_wszVersion=wszVersion;
}
VOID PrintAppInfo()
wprintf(L"\nFull application Name: %s\n", m_wszAppName);
wprintf(L"Version: %s\n", m_wszVersion);
private:
LPWSTR m_wszAppName ;
LPWSTR m_wszVersion ;
} ;
CAppInfo* g_AppInfo ;
int __cdecl wmain (int argc, WCHAR* args[])
wint_t iChar = 0 ;
g_AppInfo = new CAppInfo(L"Memory Corruption Sample", L"1.0" );
if(!g_AppInfo)
return 1;
wprintf(L"Press: \n");
wprintf(L" 1 To display application information\n");
wprintf(L" 2 To simulated memory corruption\n");
wprintf(L" 3 To exit\n\n\n>");
while((iChar=_getwche())!="3")
switch(iChar)
case "1":
g_AppInfo->PrintAppInfo();
break;
case "2":
SimulateMemoryCorruption();
wprintf(L"\nMemory Corruption completed\n");
default:
wprintf(L"\nInvalid option\n");
wprintf(L"\n\n> ");
return 0;
VOID SimulateMemoryCorruption ( )
char* pszWrite="Corrupt";
BYTE* p=(BYTE*) g_AppInfo;
CopyMemory(p, pszWrite, strlen(pszWrite));
Windbg生成dump檔案的方法:
程式崩潰(crash)的時候, 為了以後能夠除錯分析問題, 可以使用WinDBG要把當時程式記憶體空間資料都儲存下來,生成的檔案稱為dump 檔案。 步驟:
1) 開啟WinDBG並將之Attach 到crash的程式程序
2) 輸入產生dump 檔案的命令
WinDBG產生dump 檔案的命令是 .dump ,可以選擇不同的引數來生成不同型別的dump檔案。
選項(1): /m
命令列示例:.dump /m C:\dumps\myapp.dmp
註解: 預設選項,生成標準的minidump, 轉儲檔案通常較小,便於在網路上透過郵件或其他方式傳輸。 這種檔案的資訊量較少,只包含系統資訊、載入的模組(DLL)資訊、 程序資訊和執行緒資訊。
選項(2): /ma
命令列示例:.dump /ma C:\dumps\myapp.dmp
註解: 帶有儘量多選項的minidump(包括完整的記憶體內容、控制代碼、未載入的模組,等等),檔案很大,但如果條件允許(本機除錯,區域網環境), 推薦使用這中dump。
選項(3):/mFhutwd
命令列示例:.dump /mFhutwd C:\dumps\myapp.dmp
註解:帶有資料段、非共享的讀/寫記憶體頁和其他有用的資訊的minidump。包含了透過minidump能夠得到的最多的資訊。是一種折中方案
那怎麼自動生成dump檔案呢,比如對方的電腦沒有windbg,這裡用到一個window系統自帶工具,Dr.Watson
執行方式很簡單:
直接run-輸入drwtsn32 -i就可以了,會提示這樣的:
這個命令真難記,實話,記華生醫生吧,福爾摩斯中的
如果有程式崩潰,會自動生成dump,這時再輸入drwtsn32就會執行這個程式:
找到對應路徑的DMP檔案就行了,一般放在如下路徑:
C:\Documents and Settings\All Users\Application Data\Microsoft\Dr Watson
以下例項來自AWD
程式碼:
Copyright (c) Advanced Windows Debugging (ISBN 0321374460) from Addison-Wesley Professional. All rights reserved.
THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
PURPOSE.
--*/
#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include <conio.h>
VOID SimulateMemoryCorruption ( ) ;
class CAppInfo
{
public:
CAppInfo(LPWSTR wszAppName, LPWSTR wszVersion)
{
m_wszAppName=wszAppName;
m_wszVersion=wszVersion;
}
VOID PrintAppInfo()
{
wprintf(L"\nFull application Name: %s\n", m_wszAppName);
wprintf(L"Version: %s\n", m_wszVersion);
}
private:
LPWSTR m_wszAppName ;
LPWSTR m_wszVersion ;
} ;
CAppInfo* g_AppInfo ;
int __cdecl wmain (int argc, WCHAR* args[])
{
wint_t iChar = 0 ;
g_AppInfo = new CAppInfo(L"Memory Corruption Sample", L"1.0" );
if(!g_AppInfo)
{
return 1;
}
wprintf(L"Press: \n");
wprintf(L" 1 To display application information\n");
wprintf(L" 2 To simulated memory corruption\n");
wprintf(L" 3 To exit\n\n\n>");
while((iChar=_getwche())!="3")
{
switch(iChar)
{
case "1":
g_AppInfo->PrintAppInfo();
break;
case "2":
SimulateMemoryCorruption();
wprintf(L"\nMemory Corruption completed\n");
break;
default:
wprintf(L"\nInvalid option\n");
}
wprintf(L"\n\n> ");
}
return 0;
}
VOID SimulateMemoryCorruption ( )
{
char* pszWrite="Corrupt";
BYTE* p=(BYTE*) g_AppInfo;
CopyMemory(p, pszWrite, strlen(pszWrite));
}