如何让程序抓到dump文件,c windows minidumppWriteDump

如何让程序抓到dump文件,MiniDumpWriteDump_百度知道
如何让程序抓到dump文件,MiniDumpWriteDump
提问者采纳
所以找了找,当遇到你开发的程序crash时,借助网络和论坛的朋友windbg 这个工具可以手动的来抓dump文件。最近我刚好遇到这样一个事情,然后你去分析就可以,如果你想你的程序智能一些,才完成了这样一个事情,你想程序自己抓到dump文件
来自团队:
其他类似问题
为您推荐:
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁&&&&&&&&&&&
在主程序初始化时加入
DeclareDumpFile();
1 创建头文件DumpFile.h, 将下列代码放进文件中
3 #pragma once
4 #include &windows.h&
5 #include & Dbghelp.h&
6 #include &iostream&
7 #include &vector&
8 using namespace
11 #pragma comment(lib, "Dbghelp.lib")
14 namespace NSDumpFile
void CreateDumpFile(LPCWSTR lpstrDumpFilePathName, EXCEPTION_POINTERS *pException)
// 创建Dump文件
HANDLE hDumpFile = CreateFile(lpstrDumpFilePathName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
// Dump信息
MINIDUMP_EXCEPTION_INFORMATION dumpI
dumpInfo.ExceptionPointers = pE
dumpInfo.ThreadId = GetCurrentThreadId();
dumpInfo.ClientPointers = TRUE;
// 写入Dump文件内容
MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hDumpFile, MiniDumpNormal, &dumpInfo, NULL, NULL);
CloseHandle(hDumpFile);
LPTOP_LEVEL_EXCEPTION_FILTER WINAPI MyDummySetUnhandledExceptionFilter(LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter)
return NULL;
BOOL PreventSetUnhandledExceptionFilter()
HMODULE hKernel32 = LoadLibrary(_T("kernel32.dll"));
if (hKernel32 ==
return FALSE;
void *pOrgEntry = GetProcAddress(hKernel32, "SetUnhandledExceptionFilter");
if(pOrgEntry == NULL)
return FALSE;
unsigned char newJump[ 100 ];
DWORD dwOrgEntryAddr = (DWORD) pOrgE
dwOrgEntryAddr += 5; // add 5 for 5 op-codes for jmp far
void *pNewFunc = &MyDummySetUnhandledExceptionF
DWORD dwNewEntryAddr = (DWORD) pNewF
DWORD dwRelativeAddr = dwNewEntryAddr -
dwOrgEntryA
newJump[ 0 ] = 0xE9;
// JMP absolute
memcpy(&newJump[ 1 ], &dwRelativeAddr, sizeof(pNewFunc));
SIZE_T bytesW
BOOL bRet = WriteProcessMemory(GetCurrentProcess(),
pOrgEntry, newJump, sizeof(pNewFunc) + 1, &bytesWritten);
LONG WINAPI UnhandledExceptionFilterEx(struct _EXCEPTION_POINTERS *pException)
TCHAR szMbsFile[MAX_PATH] = { 0 };
::GetModuleFileName(NULL, szMbsFile, MAX_PATH);
TCHAR* pFind = _tcsrchr(szMbsFile, '\\');
*(pFind+1) = 0;
_tcscat(szMbsFile, _T("CrashDumpFile.dmp"));
CreateDumpFile(szMbsFile, pException);
// TODO: MiniDumpWriteDump
FatalAppExit(-1,
_T("Fatal Error"));
return EXCEPTION_CONTINUE_SEARCH;
void RunCrashHandler()
SetUnhandledExceptionFilter(UnhandledExceptionFilterEx);
PreventSetUnhandledExceptionFilter();
103 #define DeclareDumpFile() NSDumpFile::RunCrashHandler();
阅读(...) 评论()Vs中使用dump文件调试程序崩溃
Vs中使用dump文件调试程序崩溃
1.&Dump文件的生成
在vs中要生成dump文件需要加入一些代码,这些代码在debug或release代码下均有效果。
首先定义异常类:
class CSE_Exception {
CSE_Exception() : m_nSENumber(0) {}
EXCEPTION_RECORD&&
CONTEXT&&&&&&&&&&&&&&&
// set SE handler, for CSE_Exception.&
应该为每个线程调用
static void InitSEException();
static long _DbgDumpError(struct _EXCEPTION_POINTERS *excpInfo,
LPCTSTR szPrex);
static void _DumpSystemInfo(LPTSTR szDump, int nSize);
static void _DumpCallStack();
static void trans_func( unsigned int uSENum, _EXCEPTION_POINTERS*
#include "DbgHelp.h"
typedef BOOL (WINAPI* MINIDUMPWRITEDUMP)(HANDLE
hProcess, DWORD dwPid, HANDLE hFile, MINIDUMP_TYPE DumpType,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&CONST PMINIDUMP_EXCEPTION_INFORMATION
ExceptionParam,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&CONST PMINIDUMP_USER_STREAM_INFORMATION
UserStreamParam,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&CONST PMINIDUMP_CALLBACK_INFORMATION
CallbackParam);
long CSE_Exception::_DbgDumpError(struct
_EXCEPTION_POINTERS *excpInfo, LPCTSTR szPrex )
LONG retval = EXCEPTION_CONTINUE_SEARCH;
HMODULE hDll = ::LoadLibrary(_T("DBGHELP.DLL"));
LPCTSTR szResult = NULL;
MINIDUMPWRITEDUMP pDump = NULL;
(MINIDUMPWRITEDUMP)::GetProcAddress(hDll,"MiniDumpWriteDump");
if (pDump)
TCHAR szDumpPath [_MAX_PATH] = {0};
TCHAR szDumpFile [_MAX_PATH] = {0};
GetModuleFileName(NULL, szDumpPath, _MAX_PATH);
_tcsrchr(szDumpPath, _T('\\'))[1] = 0;
_tcscat(szDumpPath, _T("..\\logs\"));
time_t timeCurrent = time(0);
struct tm* tmc = localtime(&timeCurrent);
if ( tmc )
&&&&&&&&&&&&&
_stprintf(szDumpFile, _T("%s%d_%d_%d_%d_%d.dmp"), szPrex,
tmc-&tm_mon+1, tmc-&tm_mday, tmc-&tm_hour, tmc-&tm_min,
tmc-&tm_sec);
&&&&&&&&&&&&&
_tcscpy(szDumpFile, _T("error.dmp"));
_tcscat(szDumpPath, szDumpFile);
// create the file
HANDLE hFile = ::CreateFile( szDumpPath, GENERIC_WRITE, 0, NULL,
CREATE_ALWAYS,
&&&&&&&&&&&&&
FILE_ATTRIBUTE_NORMAL, NULL );
if (hFile!=INVALID_HANDLE_VALUE)
&&&&&&&&&&&&&
if (excpInfo == NULL) //如果没有传入异常, 比如是在程序里面调用的, 生成一个异常
&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&
// Generate exception to get proper context in dump
&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&
DWORD dwSize = 0;
&&&&&&&&&&&&&&&&&&
char *sz = "_EXCEPTION_POINTERS is null";
&&&&&&&&&&&&&&&&&&
::WriteFile(hFile, sz, strlen(sz), &dwSize, NULL);
&&&&&&&&&&&&&
&&&&&&&&&&&&&
&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&
MINIDUMP_EXCEPTION_INFORMATION eI
&&&&&&&&&&&&&&&&&&
eInfo.ThreadId = GetCurrentThreadId(); //把需要的信息添进去
&&&&&&&&&&&&&&&&&&
eInfo.ExceptionPointers = excpI
&&&&&&&&&&&&&&&&&&
eInfo.ClientPointers = FALSE;
&&&&&&&&&&&&&&&&&&
// Dump的类型是小型的, 节省空间. 可以参考MSDN生成更详细的Dump.
&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&
GetCurrentProcess(),
&&&&&&&&&&&&&&&&&&&&&&
GetCurrentProcessId(),
&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&
MiniDumpNormal,
&&&&&&&&&&&&&&&&&&&&&&
excpInfo ? &eInfo : NULL,
&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&
&&&&&&&&&&&&&
::CloseHandle(hFile);
if( hDll )
::FreeLibrary(hDll);
void CSE_Exception::InitSEException()
_set_se_translator( CSE_Exception::trans_func );
void CSE_Exception::_DumpCallStack()
&&&&&&&&&&&&&
RaiseException(1, 0, 0, NULL);
__except(_DbgDumpError(GetExceptionInformation(), _T("T")),
EXCEPTION_CONTINUE_EXECUTION)
void CSE_Exception::trans_func( unsigned int
uSENum, _EXCEPTION_POINTERS* pExp )
SE_BUF_SIZE&&&&&&&&
TCHAR pszBuf[SE_BUF_SIZE+2];
_DbgDumpError(pExp, _T("e"));
switch(uSENum)
case EXCEPTION_ACCESS_VIOLATION:
_sntprintf(pszBuf, SE_BUF_SIZE, _T("Access Violation: IP: 0xX %s
Address: 0xX"),
&&&&&&&&&&&&&
pExp-&ExceptionRecord-&ExceptionAddress,
pExp-&ExceptionRecord-&ExceptionInformation[0]?_T("Write"):_T("Read"),
pExp-&ExceptionRecord-&ExceptionInformation[1]);
case EXCEPTION_INT_DIVIDE_BY_ZERO:
_sntprintf(pszBuf, SE_BUF_SIZE, _T("INT_DIVIDE_BY_ZERO"));
case EXCEPTION_FLT_DIVIDE_BY_ZERO:
_sntprintf(pszBuf, SE_BUF_SIZE, _T("FLT_DIVIDE_BY_ZERO"));
case EXCEPTION_ILLEGAL_INSTRUCTION:
_sntprintf(pszBuf, SE_BUF_SIZE, _T("ILLEGAL_INSTRUCTION"));
case EXCEPTION_PRIV_INSTRUCTION:
_sntprintf(pszBuf, SE_BUF_SIZE,
_T("EXCEPTION_PRIV_INSTRUCTION"));
case EXCEPTION_STACK_OVERFLOW:
_sntprintf(pszBuf, SE_BUF_SIZE,
_T("EXCEPTION_STACK_OVERFLOW"));
_sntprintf(pszBuf, SE_BUF_SIZE, _T("Unknown SE_exception: X"),
CSE_Exception e(pszBuf);
e.m_nSENumber = uSEN
e.m_SERecord& = *(pExp-&ExceptionRecord);
e.m_SEContext& = *(pExp-&ContextRecord);
然后在程序的InitInstance中加入代码如下:
LONG WINAPI
DbgUnhandledExceptionFilter(PEXCEPTION_POINTERS pExceptionInfo)
CSE_Exception::_DbgDumpError(pExceptionInfo, _T("E"));
EXCEPTION_CONTINUE_SEARCH;&&&
// 程序停止运行
BOOL CDCPWorkerApp::InitInstance()
CSE_Exception::InitSEException();
//捕获未处理的异常
SetUnhandledExceptionFilter(DbgUnhandledExceptionFilter);
这样就可以了。
还有在 编译的时候,还要把.pdb文件放好,放在运行的目录下,则要一致对应。
2.&使用dump文件进行调试
首先用vs2008将它打开,点调试。
下面就下载符号表才行。
点 工具&调试&符号
再点增加, 在符号文件.pdb路径下加入::
在下面的文本框中加入一个本地存放pdb解析文件的路径如:c:\Symbols
上面的下载过程很慢,如果下载完成,则会断下,这时,在 调试中打开调用栈,打开线程,
一个一个线程进行分析,看程序是core在哪个线程中的。
--------------------
进来了就多看几篇,总有一篇适合您
--------------------
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。分析windows XP用户程序崩溃的dump文件,Dr Watson查看backtrace
inux很容易设置程序的core dump 文件,和用gdb分析程序崩溃时的backtrace。windows之前没怎么做过。运行时windows也可以调用 &MiniDumpWriteDump &函数来给自己的程序保存一个dump文件,好像以前在directx的文档里面看到一篇文章,Linux其实也是可以自己通过捕获异常退出信号,然后调用backtrace函数来打印调用堆栈的,可以看我blog里面文章。&& & & &有的程序崩溃了,windows系统会自动提示你用 visual studio 等调试器来调试。 但有的时候,只会提示“程序崩溃是否给微软发一个报告”的对话框。根据崩溃的地方有没有调试符号信息来决定的?? 不是很清楚。但这时想查看 backtrace信息就不那么容易了。&& & & 我的碰到的情况是,使用的第三方的exe来运行加载自己编译的dll,两个不兼容,就在exe里面崩溃了,肯定是自己的dll有关联的,但这时看不到崩溃的backtrace就不好定位错误信息了。&&& & & 在网上搜索了一下,发现其实是可以,不过比较麻烦一点。,windows xp采用不同于linux的设置,Linux根据你的配置会把core dump保存到当前目录,但widnows是使用统一一个程序Dr Watson 来管理用户程序崩溃报告。默认的崩溃报告在这个位置。C:Documents and SettingsAll UsersApplication DataMicrosoftDr Watson&文件夹里面有两个文件drwtsn32.log 文件里面应该有报告。user.dmp &是dump文件。&&可以通过&drwtsn32 &命令来查看。 &运行这个命令后,会弹出一个对话框,有关的设置选项也可以查看的到。比如把 crash dump type 改为full 类型,然后把&dump symbol table &等选项勾上后,以便保存更完整的信息。&再重新测试,生成新的 application error报告时,点击下面的崩溃报告,就可以查看一下详细的log,里面有程序崩溃是的函数的backtrace和出错的地址等,出错的汇编指令,加载的模块和程序等。看了这个backtrace之后,我就知道是在我的dll的哪个函数里面调用的地方出错的,然后,自己先加一个Messagebox等待一下,以便有时间用visual studio 2008 先一步 attach 到指定进程上去,再崩溃时就可以在visual studio里面调试我的dll了,以及分析汇编等了。&&系统自动生成的user.dmp 文件也可以用 windbg 程序打开,执行k命令查看backtace等,具体可以看windbg的命令参考。&&参考文章:使用 Minidumps 和 Visual Studio .NET 进行崩溃后调试http://vicchina.51.net/research/other/seh/minidumps/intro.htm&Vista 上如何在程序崩溃时自动保存dump文件http://blog.chinaunix.net/space.php?uid=53564&do=blog&id=2099414---------------补充在visual studio 2010 里面也可以直接打开 dmp文件,进行调试了。在visual studio 2008 以上,调试时,可以在debug菜单下面,选择 “save dump ” as mini dump with heap 生成的dmp文件。
> 本站内容系网友提交或本网编辑转载,其目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请及时与本网联系,我们将在第一时间删除内容!
Windows XP与VirtualBox中Ubuntu文件夹共享 1.进入Ubuntu系统后,选择VB中的设备,安装增强功能,加载VBOXADDITIONS.*.ISO 2.cd /media/cdrom0 3.sudo ./VBoxLinuxAdditions-x86.run 4.关闭Ubuntu,在VirtualBox的设置中找到数据空间,添加要共享的 ...
1,目的 有时候程序在客户那里崩溃了,你程序也没有什么有效的log日志能记录到崩溃的细节,那这实在是一件很麻烦的事情. 你得向客户反复了解操作内容并希望能在自己这里重现,这个过程想想都很痛苦吧.. 使用下面的方法,能在程序崩溃时生成一个自己的dump文件,记录了崩溃时的一些有用的信息,一般能帮你容易地找到出错的地方. 2,原理 简单地说,就是windows程 ...
转载请保留原作网站:[url]http://www.Sjhf.net[/url] (关键字:EFS解密) 北京一用户,原系统分为3个区,C盘安装WINDOWS XP SP2,D及E盘为用户重要数据区,其中D盘有用户特别重要的几个文件,当初为安全性考虑,设置了NTFS的EFS加密,后系统运行缓慢,重装系统. 系统重装后,再次打开D盘的那几个加密文件(DOC)时 ...
1 CONFIG.SYS - CONFIG.SYS是包含在DOS(磁盘操作系统,Disk Operating System)中的一个文本文件命令,它告诉操作系统计算机如何初始化.多数情况下,CONFIG.SYS命令制定内存设备驱动和程序,以控制硬件设备:开启或进制系统特征:以及限制系统资源.CONFIG.SYS在autoexec.bat(自动批处理程序)文件 ...
由于在release下无法及时定位崩溃的位置,所以建议相关人员修改工程配置,以便导出dump文件来定位release版本. 下面以VS2005为例,介绍修改过程: 如果是lib修改4处地方: 1. 工程 à properties à C/C++ àGeneral à Debug Information Format
选择 “Program Dat ...
来源:/kb/289022/zh-cn本文说明如何在 Windows XP 中从&启动和故障恢复&对话框查看和手动配置 Boot.ini 文件.在 Windows XP 中,可以非常快捷地找到 Boot.ini 文件,以验证和/或编辑该文件.建议在编辑 Boot.ini 文件之前先备 ...
第一种: 通过任务管理器:这种适用在程序挂了(crash)的时候进程还未退出,比如我运行程序,出现了下面的错: 此时打开任务管理器,右击相应进程,点击&Create Dump File&: 一会创建完成: 然后把这个DMP文件拷到开发机器上,用VS打开: 会出现下面的界面,要想知道发生错误时候的调用栈,需要设置symbol的路径,点击&q ...
经常用这个东西,因为自己有光盘,所以一般都是插上光盘装,可是万一手上没盘子怎么办,再去买,网上找也麻烦,正好看到了一个文章.留下了. 安装方法: 1.将压缩包解压2.进入 控制面板&添加或删除程序&添加/删除Windows组件3.勾选 Windows 信息服务(IIS)&下一步4.将路径指定到您解压的目录,可能需多次指定. 链接:http: ...

我要回帖

更多关于 minidumpwritedump 的文章

 

随机推荐