使用SetUnhandledExceptionFilter转储程序崩溃时内存DMP注意事项
使用代码手工生成dmp文件
- SetUnhandledExceptionFilter
为每个线程设置SetUnhandledExceptionFilter(MyCallBack),(必须在每个线程中启动时调用一次,否则造成无法进入回调函数中)这样该线程中发现未处理的 SEH 异常时就会进入到MyCallBack 回调中.
无聊的是虽然MyCallBack 的参数是 SEH 异常的结构体指针,但 C++异常也会进入到MyCallBack 中.所以只要SetUnhandledExceptionFilter 就能抓到 C++的异常了.
按C++标准,未处理的C++异常应当是触发unexpected.而MS 放出话说它的编译器只触发terminate.而在MFC 中居然terminate 都不触发了,直接变成了 SEH 而进入了MyCallBack.
部分源码:
#include "stdafx.h"
#include "DumpHandle.h"
#include <stdlib.h>
#include <stdio.h>
#include <dbghelp.h>
#pragma comment(lib, "Dbghelp.lib")
LONG WINAPI DumpHandleFilterA(struct _EXCEPTION_POINTERS *lpExceptionInfo)
{
LONG ret = EXCEPTION_EXECUTE_HANDLER;
char szFileName[128] = {0};
SYSTEMTIME st = {0};
::GetLocalTime(&st);
wsprintfA(szFileName, ("CrashAt[%04d-%02d-%02d-%02d-%02d-%02d-%02d-%02d].dmp"),
st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds, rand()%100);
HANDLE hFile = ::CreateFileA(szFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );
if (hFile != INVALID_HANDLE_VALUE)
{
MINIDUMP_EXCEPTION_INFORMATION ExInfo;
ExInfo.ThreadId = ::GetCurrentThreadId();
ExInfo.ExceptionPointers = lpExceptionInfo;
ExInfo.ClientPointers = false;
// write the dump
BOOL bOK = MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hFile, MiniDumpNormal, &ExInfo, NULL, NULL );
if (bOK)
{
DumpDbgPrintA(("Create Dump File Success!/n"));
DumpDbgMsgboxA("Create Dump File Success!/n");
}
else
{
DumpDbgPrintA(("MiniDumpWriteDump Failed: %d/n"), GetLastError() );
DumpDbgMsgboxA(("MiniDumpWriteDump Failed: %d/n"), GetLastError() );
}
::CloseHandle(hFile);
}
else
{
DumpDbgPrintA(("Create File %s Failed %d/n"), szFileName, GetLastError());
DumpDbgMsgboxA(("Create File %s Failed %d/n"), szFileName, GetLastError());
}
return ret;
}
void DumpDbgPrintA (char *fmt, ... )
{
va_list argptr;/* Argument list pointer*/
char str[1024*3] = {0};/* Buffer to build sting into*/
va_start (argptr, fmt);/* Initialize va_ functions*/
wvsprintfA (str, fmt, argptr);/* prints string to buffer*/
OutputDebugStringA(str);
va_end (argptr);/* Close va_ functions*/
}
void DumpDbgMsgboxA (char *fmt, ... )
{
va_list argptr;/* Argument list pointer*/
char str[1024*3] = {0};/* Buffer to build sting into*/
va_start (argptr, fmt);/* Initialize va_ functions*/
wvsprintfA (str, fmt, argptr);/* prints string to buffer*/
MessageBoxA (NULL, str, "Debug Message",
MB_ICONINFORMATION | MB_OK);
va_end (argptr);/* Close va_ functions*/
}
使用SetUnhandledExceptionFilter转储程序崩溃时内存DMP注意事项的更多相关文章
- 使用SetUnhandledExceptionFilter转储程序崩溃时内存DMP .
关于程序崩溃时转储内存DMP,可以设置注册表,使程序崩溃时自动转储内存DMP,见程序崩溃时利用注册表自动转储内存DMP.本文要介绍的是使用SetUnhandledExceptionFilter函数在程 ...
- 如何在.NET程序崩溃时自动创建Dump?
今天在浏览张队转载文章的留言时,遇到一个读者问了这样的问题,如下图所示: 首先能明确的一点是"程序崩溃退出了是不能用常规的方式dump的",因为整个进程树都已经退出.现场已经无法使 ...
- java程序运行时内存分配详解
java程序运行时内存分配详解 这篇文章主要介绍了java程序运行时内存分配详解 ,需要的朋友可以参考下 一. 基本概念 每运行一个java程序会产生一个java进程,每个java进程可能包含一个 ...
- Java程序运行时内存划分
1.Java程序跨平台运行的原因 主要原因是:各种平台的JVM和字节码文件 Java源程序--具体平台的机器代码文件---被编译器翻译成平台无关的Class文件,又用特定JVM运行字节码文件,JVM在 ...
- 让linux中的程序崩溃时生成core文件
当我们的linux程序崩溃的时候,常常会有这样的提示: Segmentation fault (core dumped) 段错误 (核心已转储) 提示说生成了core文件,但是此功能 ...
- android在程序崩溃时Catch异常并处理
Android系统的"程序异常退出",给应用的用户体验造成不良影响.为了捕获应用运行时异常并给出友好提示,便可继承UncaughtExceptionHandler类来处理.通过Th ...
- 程序编译时书写Makefile注意事项一例
在进行程序编译时,可能需要指定一些库的库的路径.头文件的路径,分别使用的参数选项是-L和-I,需要注意的是: 需要确保-L和-I后边的内容不为空,否则会出现意想不到的错误,而这种错误比较难以发现,引起 ...
- java程序运行时内存分配详解 (转)
转自:http://www.tuicool.com/articles/uU77v2 一. 基本概念 每运行一个java程序会产生一个java进程,每个java进程可能包含一个或者多个线程,每一个Ja ...
- C++ 程序崩溃时生成Dump文件
#include <DbgHelp.h> //生产DUMP文件 int GenerateMiniDump(HANDLE hFile, PEXCEPTION_POINTERS pExcept ...
随机推荐
- Python3 正则表达式特殊符号及用法(详细列表) http://bbs.fishc.com/thread-57691-1-1.html (出处: 鱼C论坛)
http://bbs.fishc.com/thread-57691-1-1.html 留待查询用
- 如何搭建Visual Studio的内核编程开发环境
最近正在看<寒江独钓——Windows内核安全编程>这本书,感觉这本书非常好,有兴趣的朋友可以买来看看,有关这本书的信息请参考:http://www.china-pub.com/19559 ...
- JVM调优总结(十一)-反思
垃圾回收的悖论 所谓“成也萧何败萧何”.Java的垃圾回收确实带来了很多好处,为开发带来了便利.但是在一些高性能.高并发的情况下,垃圾回收确成为了制约Java应用的瓶颈.目前JDK的垃圾回收算法,始终 ...
- 京香julia_百度百科
京香julia_百度百科 京香julia
- Thawte SSL123 SSL证书-中国证书.com
Thawte SSL123 SSL证书是域名验证型证书.也是Thawte最廉价的一款证书.该证书签发方便,仅仅须要验证域名全部权就可以签发,无需提交认证文件,通常签发时间仅仅须要1-2个小时.SSL1 ...
- cocos2dx-lua捕获用户touch事件的几种方式
这里仅仅针对lua 1.为每一个关心的事件注冊回调函数 详细分为下面几种 1>单点触摸 注冊函数为 cc.Handler.EVENT_TOUCH_BEGAN = 40 cc.Handl ...
- ASP.NET 4.5 Bundle组件(捆绑、缩小静态文件)
阅读目录: 1.开篇介绍 2.System.Web.Optimization 组件 3.System.Web.Optimization 组件基本原理 4.扩展自定义类型静态文件 1]开篇介绍 这篇文章 ...
- jQuery.localStorage() - jQuery SDK API
jQuery.localStorage() - jQuery SDK API jQuery.localStorage() From jQuery SDK API Jump to: navigati ...
- linux系统挂掉问题的分析
玩linux系统,经常遇到的一件事就是做了某个操作之后系统会突然挂掉,这要怎么办? 1. 首先我们要看log,看看是否会留下一些蛛丝马迹,比如PC/LR是否有留下来. PC是ARM的一个寄存器,即程序 ...
- HDU 1599 find the mincost route (无向图floyd最小环详解)
转载请注明出处:http://blog.csdn.net/a1dark 分析:终于弄懂了floyd的原理.以前的理解一直肤浅.所以一做到floyd应用的题.就拙计了.其实floyd的本质DP.利用前K ...